好的习惯可以防止内存相关的问题
a) 在反复使用同一个数据时释放掉或者覆盖掉。
b) 当数据不再被使用时如果不释放掉,会造成内存泄露。
基本的内存管理准则:
a) 你拥有你创建的任何对象的管理权。诸如:alloc,copy,new,mutableCopy,
等待创建的对象适用此规则。
b) 使用了retain的对象你需要管理。
在以下两种情况下你要使用retain:
i. 实现了访问方法,或者一个init方法;
ii. 保证一个对象不被其它操作引起失效
c) 当不需要对象时,需要自己释放这个对象。 通过releas或者autorelease方法。
d) 不能释放一个你没有所有权的对象。
通过引用返回的对象你没有所有权
Cocoa里面的一些方法返回的是引用:(对象为ClassName ** 或者 id *),比如通过initWithContentsOfUrl:options:error: (NSData)中的NSError对象,不能随意release。
两种创建变量的方法比较:
a) 通过NSNumber变量进行alloc,所以需要release:
NSNumber *zero = [[NSNumber alloc] initWithInteger:0];
[zero release];
b) 第二种方式是使用一个方便的构造器来返回,因此不需要retain或者release:
NSNumber *zero = [NSNumber numberWithInteger:0];
避免在使用时造成deallocing:
a) 当对象被移除时;
b) 当指针被deallocated时
Autorelease Pools:
autorelease pool 是NSAutoreleasePool的实例,在此实例中会接收autorelease消息。当autorelease pool被dealloced,会发release消息给每一个对象。 一个对象可以被放到autorelease pool多次,每一次进入pool时都会接收到release消息。
AutoreleasePool是按照栈来存储的,最近使用的pool在栈顶。
Autorelease pool应该在以下三种情况下手动使用:
a) 如果项目不是基于UI framework,比如 command-line tool
b) 如果一个循环内有很多临时变量。释放这些变量有助于降低内存峰值
c) 在线程被调用时必须启用自己的autorelease pool,不然程序会内存泄露。