我们 来看一下 下面这个例子 以便确保 大家 都能够理解 引用次数、增加 引用次数、减少 引用次数 是 怎么一回事。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #import <Foundation/NSObject.h> #import <Foundation/NSAutoreleasePool.h> @interface myClass:NSObject { int x; } @end @implementation myClass @end int main(int argc,const char *argv[]) { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; myClass *objectOfMyClass=[[myClass alloc] init]; NSLog(@"物件objectOfMyClass的引用次数为:%x。",[objectOfMyClass retainCount]); [pool drain]; NSLog(@"把自动释放池倒空后物件objectOfMyClass的引用次数为:%x。",[objectOfMyClass retainCount]); pool=[[NSAutoreleasePool alloc] init]; [objectOfMyClass autorelease]; NSLog(@"将物件objectOfMyClass添加到自动释放池后其引用次数为:%x。",[objectOfMyClass retainCount]); [objectOfMyClass retain]; NSLog(@"增加引用次数后物件objectOfMyClass的引用次数为:%x。",[objectOfMyClass retainCount]); [pool drain]; NSLog(@"将自动释放池倒空后物件objectOfMyClass的引用次数为:%x。",[objectOfMyClass retainCount]); [objectOfMyClass release]; return 0; } |
运行 这个程序后,可以得到 这样的结果:
|
2012-05-28 12:55:10.275 Sample[1051:707] 物件objectOfMyClass的引用次数为:1。
2012-05-28 12:55:10.277 Sample[1051:707] 把自动释放池倒空后物件objectOfMyClass的引用次数为:1。
2012-05-28 12:55:10.278 Sample[1051:707] 将物件objectOfMyClass添加到自动释放池后其引用次数为:1。
2012-05-28 12:55:10.278 Sample[1051:707] 增加引用次数后物件objectOfMyClass的引用次数为:2。
2012-05-28 12:55:10.279 Sample[1051:707] 将自动释放池倒空后物件objectOfMyClass的引用次数为:1。
|
在这个程序当中 我 创建了 一类假设出来的物件myClass。每个myClass类型的物件 都只包含 一个变量。适用于myClass这类物件的措施 都是 适用于NSObject这类物件的措施。
这个程序 创建了 一个新的myClass类型的物件objectOfMyClass,并且 将 这个物件的地址 存储 在变量objectOfMyClass当中。objectOfMyClass这个物件的引用次数 最初 为 1,因为 这个物件的地址 存储 在变量objectOfMyClass当中。objectOfMyClass这个物件 并没有自动添加 到自动释放池当中,所以 将 自动释放池 倒空后,物件objectOfMyClass这个物件的引用次数 依然 没有改变。
接着 创建了 一个新的自动释放池,并且 对 物件objectOfMyClass 采取了 autorelease这项措施,从而 将 其 添加 到自动释放池。将 物件objectOfMyClass 添加 到自动释放池后,其引用次数 还是没有改变,因为 将 物件 添加 到自动释放池 只是 为这个物件 做上 标记。
接着 对objectOfMyClass这个物件 采取了 retain这项措施,从而 将 这个物件的引用次数 增至 2。当我们 再次 倒空 自动释放池时,物件objectOfMyClass的引用次数 由2 减至了 1。
由于 在倒空 自动释放池之前,物件objectOfMyClass的引用次数 已经为 2了。而 倒空 自动释放池 仅仅 将 物件objectOfMyClass的引用次数 减到 1,所以 物件objectOfMyClass 并不会被清理掉。于是 对 objectOfMyClass这个物件 采取 release这项措施后,这个物件的引用次数 才降至0,从而 被清理掉。