一 . 谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。
二 . 函数中有返回的情形
在一个函数中创建并返回对象,需要把这个对象设置为autorelease
ClassA*Func1() { ClassA *obj = [[[ClassA alloc] init] autorelease]; return obj; }
三 . 除了dealloc方法以外,始终用.操作符的方式来调用property。
self.objB 或者objA.objB
四 . 容器对象的内存管理
iOS中,容器对象对其内的对象拥有所有权,也就是说,当一个对象被插入到容器内时,其retainCount会加一,从容器内移除时,其retainCount会减一,当容器本身被release时器内所有对象的retainCount都会减一。
五 . 稀缺资源包括文件,网络连接,缓存等,这些资源是很关键的系统资源,系统内其他应用可能会随时需要这些资源,所以,这些资源就不适合作为类的成员变量了,因为dealloc的实际调用时间,是否真正调用是我们无法控制的,很有可能造成稀缺资源被无意义的占用,其他应用却无法获得相应资源。所以,随时申请随时释放是最好的选择。
六 . 避免循环引用,如果两个对象互相为对方的成员变量,那么这两个对象一定不能同时为retain,否则,两个对象的dealloc函数形成死锁,两个对象都无法释放。
七 . 不要滥用autorelease,如果一个对象的生命周期很清晰,那最好在结束使用后马上调用release,过多的等待autorelease对象会给内存造成不必要的负担。
八 . // assign
-(void)setTestObject:(id)newValue { testObject= newValue; }
//retain
-(void)setTestObject:(id)newValue { if (testObject!=newValue) { [testObject release]; testObject=[newValue retain]; } }
//copy
-(void)setTestObject :(id)newValue { if(testObject !=newValue) { [testObject release]; testObject =[newValue copy]; } }
asssign : 相于于指针赋值,不对引用计数进行操作,注意原对象不用了,一定要把这个设置为nil
retain : 相当于对原对象的引用计数加1
copy : 不对原对象的引用计数改变,生成一个新对象引用计数为1
原帖地址:http://blog.csdn.net/tiantian1980/article/details/9494689