2011年5月15日 星期日

Fundation Framework-記憶體管理 CH17-5 Intro Ref. Counting 5

//

// main.m

// CH17-5 Intro Ref. Counting 5

//

// Created by jason on 2011/5/15.

// Copyright 2011 __MyCompanyName__. All rights reserved.

//


#import

#import

#import


//簡單設計 ClassA 物件 ,自行設計 setter getter

@interface ClassA : NSObject

{

NSString *str;

}


-(void) setStr: (NSString *) s;

-(NSString *) str;

-(void) dealloc; //增加dealloc方法

@end


@implementation ClassA

-(void) setStr: (NSString *) s

{

// free up old object since we're done with it

[str autorelease]; //str 實體變數放入autorelease pool,這不會釋放它,這讓他後續在release 發現 ref. count =0 ,就可以被釋放

// retain argument in case someone else releases it

str = [s retain]; // retain 方法回傳給接收者

}


-(NSString *) str

{

return str;

}


-(void) dealloc{

NSLog(@"ClassA dealloc");

[str release]; // 釋放 str 實體變數

[super dealloc]; // 呼叫父類別 dealloc

}

@end


int main(int argc, char *argv[])

{

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

NSMutableString *myStr=[NSMutableString stringWithString:@"A string"];

ClassA *myA=[[ClassA alloc] init];

NSLog(@"myStr retain count:%x", [myStr retainCount]); // Ref. Count = 1

[myA autorelease];

[myA setStr: myStr]; // myA (ClassA) 呼叫 myStr

NSLog(@"myStr retain count:%x", [myStr retainCount]); // myA呼叫後為 Ref. Count =2

[pool drain]; // Autorelease pool 開始

return 0;

//return NSApplicationMain(argc, (const char **) argv);

}

// 注意myStr 是可以改變的字串 , setStr開始後,若又更改 myStr內容 ,也會更動 str實體變數的值 ,因為他們都ref. 到相同的記憶體位址

沒有留言: