2011年5月15日 星期日

Foundation Framework-記憶體管理 CH17-2 Reference counting With String

#import

#import

#import

#import


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

{

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

NSString *myStr1=@"Constant string"; // myStr1 為常數字串

NSString *myStr2=[NSString stringWithString: @"string 2"]; // myStr 2 為不可變更字串

NSMutableString *myStr3=[NSMutableString stringWithString: @"string 3"]; // myStr 3 @" string 3" 的副本

NSMutableArray *myArr =[NSMutableArray array];

NSLog(@"Retain count: myStr1: %lx,myStr2: %lx,myStr3: %lx", (unsigned long) [myStr1 retainCount],

(unsigned long) [myStr2 retainCount],

(unsigned long) [myStr3 retainCount]);

/* 結果:

Retain count: myStr1: fffffffffffffff, => 常數字串不用釋放 ,所以retainCount = 0xFFFF;

myStr2: fffffffffffffff, => 不可變更字串 等同 常數字串 ,它只是將Str2 指向 @" string ", 所以retainCount = 0xFFFF;

myStr3: 1 => stringWithString 將訊息傳給 NSMutableString時字串會被複製過, 因為程式執行過程中會改變其值,所以他的方法跟Str2不同

*/

[myArr addObject:myStr1];

[myArr addObject:myStr2];

[myArr addObject:myStr3];


NSLog(@"Retain count: myStr1: %lx,myStr2: %lx,myStr3: %lx", (unsigned long) [myStr1 retainCount],

(unsigned long) [myStr2 retainCount],

(unsigned long) [myStr3 retainCount]); //=> Str3被參考myArr1 ,所以 ref . count = 2

[myStr1 retain];

[myStr2 retain];

[myStr3 retain];

NSLog(@"Retain count: myStr1: %lx,myStr2: %lx,myStr3: %lx", (unsigned long) [myStr1 retainCount],

(unsigned long) [myStr2 retainCount],

(unsigned long) [myStr3 retainCount]); //=> Str3retain1 ,所以 ref . count = 2+1=3

// Vring the reference count of myStr3 back down to 2

[myStr3 release]; // 此時 ref. count = 3-1 = 2


[pool drain]; // 此時myArr release, myStr ref. count= 1 ,之後 pool 自己再 release, Ref. count=0

return 0;

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

}

沒有留言: