2010-11-27 53 views
2
NSString *notAllocatedString = @"This string was not allocated."; 
NSString *allocatedString = [[NSString alloc] initWithFormat:@"This string was allocated."]; 

NSLog(@"%@", notAllocatedString); 
NSLog(@"%@", allocatedString); 

這兩個字符串都打印得非常好。兩者的區別究竟是什麼?我的意思是,我知道一段內存分配給第二個,應該被釋放,但除此之外 - 每個內存的優點和缺點是什麼?初學者Objective-C NSString問題

回答

3

第一種是靜態的,編譯器和運行時是負責存儲器。你應該儘可能使用這種方法。編譯器有一些很好的內存優化(就像所有相同的字符串都會指向內存中的同一個地址)。

第二個,你創建它一個運行時間,並且你負責內存。這是字符串動態時應使用的方法。它將複製靜態字符串的內容到allocatedString

總而言之,當字符串是靜態的時候,通過使用initWithFormat來創建不必要的開銷。靜態字符串將以兩種方式創建,第二種方法將僅將內容複製到另一個NSString

1

-initWithFormat:對於當您需要在編譯時不知道(和/或不能)知道需要替換的東西時非常有用。

例如:

id value = ...; //some user-entered value, say like "42" 
NSString * allocatedString = [[NSString alloc] initWithFormat:@"The user-entered value is: %@", value]; 
NSLog(@"%@", allocatedString); //logs "The user-entered value is: 42" 
[allocatedString release]; 
0

Objective-C 2.0的出現爲開發人員提供了方便的語法,讓您可以更自由,更動態地聲明變量,這與您在腳本語言中獲得的內容類似。在你的情況下,自動引用計數下的兩個語句沒有區別。對於聲明其他Objective-C數據結構也有類似的簡化語法(例如NSArray * array = [@「Foo」,@「Bar」,@「Hello World」];)