學習的時候碰到了如下的例子:
#import <Foundation/Foundation.h>@interface RetainTracker : NSObject@end // RetainTracker@implementation RetainTracker- (id) init{if (self = [super init]) {NSLog (@"init: Retain count of %d.", [self retainCount]);}return (self);} // init- (void) dealloc{NSLog (@"dealloc called. Bye Bye.");[super dealloc];} // dealloc@end // RetainTrackerint main (int argc, const char * argv[]){ RetainTracker *tracker = [RetainTracker new]; // count: 1 [tracker retain]; // count: 2 NSLog (@"%d", [tracker retainCount]); [tracker retain]; // count: 3 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count: 2 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count: 1 NSLog (@"%d", [tracker retainCount]); [tracker retain]; // count 2 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count 1 NSLog (@"%d", [tracker retainCount]); [tracker release]; // count: 0, dealloc it return (0);} // main
這是一個講解引用計數器最最簡單的例子,也是最基礎的。
知識點如下:
1.當一個對象調用alloc,new,copy方法時,引用計數器的值會加1。
2.當一個對象調用release方法時,引用計數器的值會減1。
3.當引用計數器變為0的時候,對象自己會調用dealloc方法。
4.要想獲得引用計數器的值,可以調用retainCount方法來獲得。
5.要想自主的將計數器的值加1,可以通過調用retain方法實現。
所以上面的代碼中,用到了new方法來建立對象,計數器會自動加1。調用retain方法也會讓計數器加1。release的時候計數器就會減1。當計數器的值為0的時候,就會調用dealloc方法。所以上面的代碼輸出才會是下面的樣子:
2015-01-28 22:32:54.170 09.01 RetainCount-1[620:23479] init: Retain count of 1.2015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 22015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 32015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 22015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 12015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 22015-01-28 22:32:54.172 09.01 RetainCount-1[620:23479] 12015-01-28 22:32:54.172 09.01 RetainCount-1[620:23479] dealloc called. Bye Bye.Program ended with exit code: 0