關於NSString的各種初始化與之的retainCount
int main(int argc, const char * argv[]){ @autoreleasepool { NSString *s1 = @"Constant string"; NSLog(@"%lx", [s1 retainCount]); // ffffffffffffffff NSString *s2 = [NSString stringWithString:@"string 2"]; NSLog(@"%lx", [s2 retainCount]); // ffffffffffffffff NSString *s3 = [NSString stringWithFormat:@"%s", @"string 3"]; NSLog(@"%lx", [s3 retainCount]); // 1 NSMutableString *s4 = [NSMutableString stringWithString:@"string 4"]; NSLog(@"%lx", [s4 retainCount]); // 1 NSString *s5 = [NSString stringWithString:[NSString stringWithFormat:@"string 5"]]; NSLog(@"%lx", [s5 retainCount]); // 2 NSString *s6 = [[NSString alloc] init]; NSLog(@"%lx", [s6 retainCount]); // ffffffffffffffff s6 = @"string 6"; NSLog(@"%lx", [s6 retainCount]); // ffffffffffffffff } return 0;}
記憶體中常量字串的空間分配與其它對象不同,它們沒有引用計數機制,因為永遠不能釋放這些對象,這就是為什麼向s1發送訊息retainCount,而它返回
ffffffffffffffff,實際上在標準標頭檔<limits.h>中,此值被定義為最大的不帶正負號的整數,或者UINT_MAX.
這也同樣適用於使用常量字串初始化不可變對象:這種對象也沒有保持值.
在下面這一句中:
NSMutableString *s4 = [NSMutableString stringWithString:@"string 4"];
變數s4被設定成常量字串@"string 4"的副本。製作字串副本的原因是向NSMutableString發送了stringWithString:訊息,表示該字串的內容可能在程式執行期間發生變化。由於常量字串的內容是不能改變的。所以系統不能將變數s4設為指向常量字串@"string 4",而s2是可以的。