Objective-c自学笔记(4)-内存管理中retain和release

来源:互联网 发布:linux下关闭tomcat 编辑:程序博客网 时间:2024/05/16 18:22

学习的时候碰到了如下的例子:


#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



0 0