在内存管理方面有一个基本的规则需要遵守:每当使用alloc、[mutable]copy[withZone:]或retain来增加引用计数的方法时,必须对应地使用release或autorelease进行释放。
理解:对象自身负责管理retainCount的增减,这有助于显著降低内存泄漏的可能性。
实例:
@implementation Person- (void) setDog:(Dog *)aDog{ if(_dog != aDog){ [_dog release]; _dog = [aDog retain]; }}- (id) dealloc{ [super dealloc]; [_dog release];} @end 在这个Person类中,由于setDog函数会对dog对象进行retain操作,但作为使用者你并不知道内部对这个dog对象进行了多少次retain。因此,将release操作放在dealloc中是一个不错的选择,这样在对象被销毁时会自动释放。
补充:对于一些初学者来说,可能会疑惑,随着ARC的出现,是否需要遵循传统的内存管理规则。实际上,ARC和传统的内存管理还是有区别的。ARC是Xcode为我们在源代码中添加了我们手动需要添加的内存管理语句,但本质上它仍然属于手动内存管理的范畴。了解这一点对开发来说非常有帮助。这种方法的好处是将内存管理的重担交给了Xcode,而不是交给运行时环境。如果使用垃圾回收机制来管理内存,运行时环境需要消耗额外的资源,尤其是内存资源。而在Java的亲儿子Android中,由于垃圾回收机制的存在,安卓手机需要配备3GB的内存才能与苹果的1GB内存相比。这额外的2GB内存去哪里了?那就是垃圾回收了。