1.簡(jiǎn)單理解
內(nèi)存泄漏指的是堆內(nèi)存泄漏,棧不會(huì)發(fā)生內(nèi)存泄漏,只會(huì)發(fā)生棧溢出(StackOverFlow)。
簡(jiǎn)單一個(gè)創(chuàng)建對(duì)象的方法:
A *a = [[A alloc]init];
a指針存在于棧上,a所指向的A的對(duì)象存在于堆上。
a為nil時(shí),A的對(duì)象沒釋放掉,那么就發(fā)生內(nèi)存泄漏了。
比如iOS很多C框架的東西(OC有自動(dòng)引用機(jī)制,不需要手動(dòng)釋放)
{
//dtimer指針在棧空間,dispatch_source_t對(duì)象在堆空間
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對(duì)象釋放了,a沒有回收,那么就是野指針。
{
while(true)
{
A *a = [[A alloc]init];
}
}
這樣就會(huì)造成StackOverFlow。