学习的时候碰到了如下的例子:
#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 // RetainTracker
int 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] 2
2015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 3
2015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 2
2015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 1
2015-01-28 22:32:54.171 09.01 RetainCount-1[620:23479] 2
2015-01-28 22:32:54.172 09.01 RetainCount-1[620:23479] 1
2015-01-28 22:32:54.172 09.01 RetainCount-1[620:23479] dealloc called. Bye Bye.
Program ended with exit code: 0