ios内存管理--个人理解

ios内存管理:

ios 不同mac os,ios没有垃圾回收机制(mac os有),主要原因是移动设备资源有限?还是他的专属框架cocoa不支持?或两者,哈哈哈,列出来了,请意会。所以在ios编程中内存管理很重要--引用计数器(rc),如果不注意,就可能出现内存泄漏leak 或者 bad access(访问一个已销毁的对象地址)错误

  1. 内存管理的基本原则:您只能注销(release)或释放(autorelease)您拥有的对象,‘拥有’的意思是您拥有一个对象的所有权,按照cocoa的命名规则,一般您使用名字以alloc,copy*,new*(xxx*表示包含xxx)的方法创建一个对象a时,您拥有a的所有权。抑或使用retain获得一个对象的所有权。
  2. 使用release和autorelease释放一个对象的所有权,release的意思是立即释放,对象引用计数器 -=1(注意使用对象xxxcount查看对象引用计数可能造成误解。按照xxx说法,当对象的引用计数==0时,调用对象 delloc,然后销毁对象,但当你调用对象的xxxcount查看对象的引用数时往往大于你的预期值0,这个不必担心,因为你不清楚这个框架的类之间的关系,你也不需要了解。你只需要做的是保证您的代码里,get(得到所有权)  -->release/autorelease所有权。在ios中你只不过是一个过客,不是主人,订房要退房(不够准确?确实,订房没有所有权啊)....,或者换一种说法有借有还。
  3. 上面第二点只说release,在这说一下autorelease,auto...(表示autorelease,下面一样)的意思是‘将会发送release消息释放’,其实是把对象放进对应的自动释放池里(就近原则?),至于到底什么时候释放呢?这个与autoreleasepool(自动释放池)有关,当release/drain 池之前,会发送一条release消息给池里每一个对象。而自动释放池有他的作用域。好,下面说一下,autorelease用得最多的地方...
    -(void) creatObject
    {
       NSString *s = [[NSString alloc] init]//创建字符串对象s
       return [s autorelease] //要养成好习惯,今天的事今天作
    			  //返回方法里您新建的对象(请意会--)时,返回前,把它放进自动释放池
    }

  4. autoreleasepool(自动释放池),cocoa应用程序总期望有一个可用的自动释放池,如果自动释放池不可用或不存在,那么自动释放对象则无法释放,导致内存泄漏(leak)。
    1. 自动释放池可以嵌套,嵌套是什么?看代码:
      -(void)run
      {
         NSAutoReleasePool *pool= [[NSAutoReleasePool alloc] init] //伪代码,意会
         ... //some code here
        NSAutoReleasePool *innerPool= [[NSAutoReleasePool alloc] init] //嵌套自动释放池
        ... //some code here
       [innerPool release]
       [pool release]
      
      
      }
      其实,在cocoa应用程序运行的堆栈中,但您创建了一个自动释放池,它会被添加到栈顶(随着方法),所以,为了防止内存泄漏,栈底应该也要有一个自动释放池。君不见,ios main方法中,不也是有个...。自动释放池的作用域是 init -》release(在相同的上下环境,可以简陋地认为在同一方法),内嵌套自动释放池,通常用在创建大量临时对象。
      -(void)run
      {
         
         for (int i= 0,i <99999,i++){
             NSAutoReleasePool *innerpool= [[NSAutoReleasePool alloc] init] 
             NSString *s = [[NSString alloc] init]
              ... //some code here
            [s autorelease]
             [innerpool release]
      
      }
      
      }
      


  5. 线程与池,每个线程都有他们自己的线程栈,所以意会第四点红体字
  6. 异常与池,解析看第四点红体字
  7. 在‘鸡生蛋,蛋生鸡’的问题上,只需确认鸡能生蛋就行了
  8. (未完待续)


你可能感兴趣的:(object-c,ios)