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];
obj1持有对象,obj2不持有对象。
(可以认为object方法对应一个NSAutoreleasePool。方法结束时,NSAutoreleasePool被废弃,pool内obj的release方法被调用。)
在ARC下,因为变量obj1和obj2都是强引用,所有都强持有新生成的对象。
原文:http://www.cnblogs.com/gattaca/p/5970954.html