//
// 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. 到相同的記憶體位址
沒有留言:
張貼留言