int main(int argc, char *argv[]){ objective-c
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init]; spa
NSString *myStr1=@"Constant string"; 設計
NSString *myStr2=[NSString stringWithString:@"string2"]; 對象
NSMutableString *myStr3=[NSString stringWithString:@"string3"]; 內存
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]); string
[myArr addObject:myStr1]; it
[myArr addObject:myStr1]; table
[myArr addObject:myStr3]; 程序設計
NSLog(@"Retain count:myStr1:%lx, myStr2:%lx, myStr3:%lx",(unsigned long)[myStr1 retainCount],(unsigned long)[myStr2 retainCount],(unsigned long)[myStr3 retainCount]);
[myArr addObject:myStr1];
[myArr addObject:myStr1];
[myArr addObject:myStr3];
NSLog(@"Retain count:myStr1:%lx, myStr2:%lx, myStr3:%lx",(unsigned long)[myStr1 retainCount],(unsigned long)[myStr2 retainCount],(unsigned long)[myStr3 retainCount]);
[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]);
[pool drain];
}
輸出結果:
Retain count: myStr1:ffffffff, myStr2:ffffffff, myStr3:1
Retain count: myStr1:ffffffff, myStr2:ffffffff, myStr3:2
Retain count: myStr1:ffffffff, myStr2:ffffffff, myStr3:3
將NSString對象myStr1賦值爲NSConstantString @「Constant string」。內存中常量字符串的空間分配與其餘對象不一樣,它們沒有引用計數機制,由於永遠不能釋放這些對象,這就是爲何向mystr1發送消息retainCount,而它返回0xffffffff的緣由。而變量myStr3被設置爲常量字符串的副本(NSMutableString *myStr3=[NSString stringWithString:@"string3"];)。製做字符串副本的緣由是向NSMutableString類發送了stringWithString消息,代表該字符串的內容可能在程序執行期間發生變化。因爲常量字符串的內容是不能改變的,因此係統不能將變量myStr3設爲指向常量字符串@"string3",而myStr2能夠。
整理摘自《objective-c 2.0程序設計》