#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被參考myArr過1次 ,所以 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]); //=> Str3被retain過1次 ,所以 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);
}
沒有留言:
張貼留言