美文网首页学习准备
iOS autorelease的实现原理

iOS autorelease的实现原理

作者: 打不死的小怪兽 | 来源:发表于2019-01-07 11:10 被阅读12次

autorelease就是自动释放,会像C语言的自动变量那样来对待对象实例。当超出作用于时,对象实例的release实例方法被调用。

一、autorelease的具体使用方法如下:

(1)生产并持有NSAutoreleasePool对象;
(2)调用分配对象的autorelease实例方法;
(3)飞起NSAutoreleasePool对象。
NSAutoreleasePool对象的生命周期相当于C语言变量的作用域。对于所有吊用过autorelease实例方法对象,在废弃NSAutoreleasePool对象时,都将调用release实例方法。
用源代码表示如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
id obj = [[NSObject alloc]init];
[obj autorelease];
[pool drain];

注意:大量产生autorelease的对象时,只要不废弃NSAutoreleasePool对象,那么生产的对象就不能释放,因此有时会产生内存不足的现象。

Cocoa框架中也有很多类方法用于返回autorelease的对象。比如NSMutableArray类的arrayWithCapacity类方法
id array = [NSMutableArray arrayWithCapacity:1];

此源代码等同于以下源码。

id array = [[[NSMutableArray  alloc]initWithCapacity:1]autorelease];
二、autorelease实现
[obj autorelease];

此源代码调用NSObject类的autorelease实例方法。

- (id) autorelease {
  [NSAutoreleasePool addObject:self];
}

下面看一下NSAutoreleasePool类的实现。由于NSAutoreleasePool类的源代码比较复杂,所以我们假想一个简化的源代码进行说明。

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

addObject类方法调用正在使用的NSAutoreleasePool对象的addObject实例方法。

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

总结:如果调用NSObject类的autorelease实例方法,该对象将被追加到正在使用的NSAutoreleasePool 对象中的数组里

以下为通过drain实例方法废弃正在使用的NSAutoreleasePool对象的过程
-  (void)drain {
  [self dealloc];
}
- (void)dealloc {
  [self emptyPool];
  [array release];
}
- (void)emptyPool {
  for(id obj in array) {//数组里面的所有对象都调用release实例方法
    [obj release];
  }
}

相关文章

网友评论

    本文标题:iOS autorelease的实现原理

    本文链接:https://www.haomeiwen.com/subject/ambyrqtx.html