转帖:iOS 内存管理原理

一 . 谁创建,谁释放(类似于谁污染,谁治理)。如果你通过allocnewcopy来创建一个对象,那么你必须调用releaseautorelease

二 . 函数中有返回的情形

在一个函数中创建并返回对象,需要把这个对象设置为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

原文地址:https://www.cnblogs.com/dayw/p/3228354.html