首先要说明内存管理中重要的一点:
有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,就防止了内存的泄露。
|
|