A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© JRayln 中级黑马   /  2015-3-30 23:09  /  1195 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 JRayln 于 2015-3-30 23:28 编辑

该贴主要说明如何严谨保证内存不泄露,初学者可理解着看看:
首先要说明内存管理中重要的一点:
       有alloc就要有release,有retain就要有release。
举例说明如何做到防止内存泄露(严谨):
       用人读书来举例:
       需要在内存中开辟四块空间,分别存放人对象([[Person alloc] init]),指向人对象的指针(Person *p),书对象([[Book alloc] init])       指向书对象的指针(Book *b);
       既然出现alloc,就一定要有release,在main函数最后执行[p release]; p=nil; [b release];b=nil;
       这样首先保证了最基本的内存不会泄露,但注意:
       在Person类中,存在Book *_book类型成员变量,且有set、get方法,当人读书这个动作发生时,Person类中的_book变量会指向Book类,翻译成代码为:[p setBook:b];b作为一个Book类型的对象参数传入set方法,那么成员变量_book指向Book,就会使计数器+1,既然有+1,那么就一定要有retain执行这个+1的动作,所以在setBook方法中代码体现为:_book = [book retain];如前面所说,有retain,就要有release,当人读完书,将人销毁,执行[p release];    p = nil;这样一来人对象被销毁,在对象内的_book成员变量也被销毁,也就不再指向Book类,但是类中计数器的值没有减少,这样就无意间造成了内存的泄露,为了防止这种情况出现:就要在人对象销毁时,将数对象也进行销毁动作。人销毁会执行- (void)dealloc;这样,在该方法中增加:
_book = [b release];这样一来,计数器-1,就防止了内存的泄露。

PS:上文为学习多对象的内存管理的知识小结,如有说的不清楚或错误的地方,希望发现的朋友能指正,谢谢

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马