1.简单理解
内存泄漏指的是堆内存泄漏,栈不会发生内存泄漏,只会发生栈溢出(StackOverFlow)。
简单一个创建对象的方法:
A *a = [[A alloc]init];
a指针存在于栈上,a所指向的A的对象存在于堆上。
a为nil时,A的对象没释放掉,那么就发生内存泄漏了。
比如iOS很多C框架的东西(OC有自动引用机制,不需要手动释放)
{
//dtimer指针在栈空间,dispatch_source_t对象在堆空间
dispatch_source_t dtimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(dtimer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(dtimer, ^{
sum--;
NSLog(@"sum:%d",sum);
});
//释放dtimer指向的堆空间
dispatch_resume(dtimer);
//如果不释放,函数执行完毕,dtimer变量就没了,造成内存泄漏。
}
如果A对象释放了,a没有回收,那么就是野指针。
{
while(true)
{
A *a = [[A alloc]init];
}
}
这样就会造成StackOverFlow。