1.簡單理解
內(nèi)存泄漏指的是堆內(nèi)存泄漏奕锌,棧不會發(fā)生內(nèi)存泄漏帝火,只會發(fā)生棧溢出(StackOverFlow)呛谜。
簡單一個創(chuàng)建對象的方法:
A *a = [[A alloc]init];
a指針存在于棧上溶诞,a所指向的A的對象存在于堆上。
a為nil時拧篮,A的對象沒釋放掉溜在,那么就發(fā)生內(nèi)存泄漏了。
比如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);
//如果不釋放赏参,函數(shù)執(zhí)行完畢志笼,dtimer變量就沒了沿盅,造成內(nèi)存泄漏。
}
如果A對象釋放了纫溃,a沒有回收腰涧,那么就是野指針。
{
while(true)
{
A *a = [[A alloc]init];
}
}
這樣就會造成StackOverFlow紊浩。