黑马程序员技术交流社区
标题:
多对象内存管理
[打印本页]
作者:
JRayln
时间:
2015-3-30 23:09
标题:
多对象内存管理
本帖最后由 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:上文为学习多对象的内存管理的知识小结,如有说的不清楚或错误的地方,希望发现的朋友能指正,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2