内存泄漏理解

2017-11-20  本文已影响12人  宙斯YY

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。

上一篇 下一篇

猜你喜欢

热点阅读