1,谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。
2, 函数中有返回的情形
在一个函数中创建并返回对象,需要把这个对象设置为autorelease
ClassA*Func1()
{
ClassA*obj = [[[ClassA alloc]init]autorelease];
returnobj;
}
3, 除了dealloc方法以外,始终用.操作符的方式来调用property。
self.objB 或者objA.objB
4, 容器对象的内存管理
iOS中,容器对象对其内的对象拥有所有权,也就是说,当一个对象被插入到容器内时,其retainCount会加一,从容器内移除时,其retainCount会减一,当容器本身被release时器内所有对象的retainCount都会减一。
5,稀缺资源包括文件,网络连接,缓存等,这些资源是很关键的系统资源,系统内其他应用可能会随时需要这些资源,所以,这些资源就不适合作为类的成员变量了,因为dealloc的实际调用时间,是否真正调用是我们无法控制的,很有可能造成稀缺资源被无意义的占用,二其他应用却无法获得相应资源。所以,随时申请随时释放是最好的选择。
6,避免循环引用,如果两个对象互相为对方的成员变量,那么这两个对象一定不能同时为retain,否则,两个对象的dealloc函数形成死锁,两个对象都无法释放。
7,不要滥用autorelease,如果一个对象的生命周期很清晰,那最好在结束使用后马上调用release,过多的等待autorelease对象会给内存造成不必要的负担。
8,// 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