内存管理

引用计数

OC是通过控制对象的引用计数来管理内存的。
<h6>内存管理原则:谁申请,谁释放</h6>

alloc / new / copy / mutableCopy 初始化对象并持有该对象,除此之外的初始化方法都不会持有该对象
retain 引用计数 +1,持有对象
release 引用计数 -1,释放对象
dealloc 当引用计数=0时,调用dealloc方法,销毁对象

初始化对象,并持有该对象:
NSString *str = [[NSString alloc]init];

初始化对象,但不持有该对象:
id obj = [NSMutableArray array];
自己持有该对象
[obj retain];

autorelease

对象调用autorelease的方法:
1.生成并持有NSAutoreleasePool对象
2.将对象添加到NSAutoreleasePool中
3.废弃NSAutoreleasePool对象

所有添加到NSAutoreleasePool中的对象,在NSAutoreleasePool废弃时都会调用release方法

屏幕快照 2017-02-20 下午5.21.14.png

NSAutoreleasePool是在主线程的NSRunLoop中操作的,当调用大量的autorelease方法时,只要不废弃NSAutoreleasePool,调用autorelease的对象也不会释放,会产生内存不足的现象。
因此要在适当的地方持有并废弃NSAutoreleasePool对象

autorelease实现

GNUstep是Cocoa的互换框架,虽然源代码不相同,但实现的方式是相似的。理解GNUstep框架有助于理解苹果的源代码。

<h5>GNUstep</h5>

<h6>autorelease方法的本质是调用NSAutoreleasePool对象的addObject方法。</h6>

+ (void) addObject: (id) anObj
{
    // pool变量取得正在使用的NSAutoreleasePool
    NSAutoreleasePool *pool = 取得正在使用的NSAutoreleasePool对象;
    if( pool != nil ){
      //调用NSAutoreleasePool的对象addObject的实例方法
        [pool addObject:anObj];
    }else{
        NSLog(@"NSAutoreleasePool对象非存在状态下调用autorelease");
   }
}

addObject实例方法
当调用autorelease方法时,该对象就会被添加到NSAutoreleasePool中的数组中。

- (void) addObject: (id) anObj
{
      [array addObject: anObj];
}

通过drain废弃NSAutoreleasePool

    [pool drain];

废弃drain的过程

屏幕快照 2017-02-20 下午6.07.54.png

苹果的实现

屏幕快照 2017-02-20 下午6.10.55.png

屏幕快照 2017-02-20 下午6.11.13.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 自动引用计数 自动引用计数:指内存管理中对引用采取自动计数的技术。 内存管理/引用计数 持有对象引起引用计数加...
    南京小伙阅读 1,329评论 2 3
  • 前言 从我开始学习iOS的时候,身边的朋友、网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于...
    盖世英雄_ix4n04阅读 573评论 0 1
  • 一、内存管理的思考方式下文会常用到的术语解释生成对象:创建对象持有对象:引用计数+1释放对象:引用计数-1废弃对象...
    iOSUI拖拽工程师阅读 1,554评论 0 3
  • 貌似每个iOS开发者都有一篇属于自己的内存管理,记录了自己对内存管理理解的深度以及广度,所以我也来记录一下我的理解...
    Bugfix阅读 2,276评论 0 3
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,521评论 1 3