码迷,mamicode.com
首页 > 其他好文 > 详细

Automatic Reference Counting

时间:2016-10-17 20:59:39      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

NSObject简化版alloc:

struct obj_layout {
    NSUInteger retained;
};

+ (id)alloc {
    
    int size = sizeof(struct obj_layout) + 对象大小;
    struct obj_layout *p = (struct obj_layout *)calloc(1, size);
    return (id)(p + 1);
}

技术分享

(将引用计数保存在对象占用内存块头部的变量中是GNUstep的实现。而苹果的实现,则是保存在引用计数表中。引用计数表可以用hash表实现,表键值为内存块地址的散列值。)

  retain方法使retained变量加1;

  release方法使retained变量减1;

  retainCount方法返回retained变量 + 1。

  autorelease方法的本质就是调用NSAutoreleasePool对象的addObject类方法。

技术分享
- (id)allocObject {
    
    id obj = [[NSObject alloc] init];
    return obj;
}

- (id)object {
    
    id obj = [[NSObject alloc] init];
    [obj autorelease];
    return obj;
}

id obj1 = [obj0 allocObject];
id obj2 = [obj0 object];
View Code

obj1持有对象,obj2不持有对象。

(可以认为object方法对应一个NSAutoreleasePool。方法结束时,NSAutoreleasePool被废弃,pool内obj的release方法被调用。)

 

在ARC下,因为变量obj1和obj2都是强引用,所有都强持有新生成的对象。

 

Automatic Reference Counting

标签:

原文地址:http://www.cnblogs.com/gattaca/p/5970954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!