zoukankan      html  css  js  c++  java
  • 转帖: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

  • 相关阅读:
    docker 日常使用笔记
    docker swarm:启动多个 overlay网络出现 could not find an available IP while allocating VIP问题
    docker 容器启动失败:Could not attach to network
    fabric : orderer启动失败
    git 代码迁移
    Docker 远程访问
    Struts2标签
    BS与CS的联系与区别
    Java的引用和C++的指针de区别
    抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/dayw/p/3228354.html
Copyright © 2011-2022 走看看