2011-05-20 41 views
11

鑑於這種代碼:@「某些文本」是否給出自動釋放或保留1個對象?

// Initialize string 
NSString *name = @"Franzi"; 

@「」宏創建與給定的文本(這裏的名稱弗蘭西)和1一個保留計數一個的NSString?

所以@「」給出了一個NSString必須被釋放嗎?我負責這個對象嗎? 第二個代碼示例則混淆了我,即使我用這種方式:

NSSting *message; 
message = [NSString stringWithFormat:@"Hello @%!",name]; 
//message = [NSString stringWithFormat:@"Hello Girl!"]; 

所以消息被在接下來的運行循環,K釋放。但是,作爲stringWithFormat參數提供的NSString是什麼?

請問類對象NSString是否釋放NSString @「Hello%@」/ @「Hello Girl」作爲參數? 還是@「」 - Konstruktor只回饋自動發佈的NSStrings?

+1

關於常量/字符串堆棧溢出的一些其他問題:[1](http://stackoverflow.com/questions/1390334/nsstring-retain-count)[2](http://stackoverflow.com/問題/ 2768443/where-are-constant-nsstrings-allocated)[3](http://stackoverflow.com/questions/4804943/difference-bewteen-declaring-a-nsstring-with-alloc-and-init-and-分配 - )[4](http://stackoverflow.com/questions/2014667/memory-management-in-objective-c)[5](http://stackoverflow.com/questions/1320161/is-string-編譯器優化編譯) – 2011-05-20 09:04:53

+1

'@「」'不是一個宏,而是一個Objective-C字符串文字。 – 2011-05-20 09:07:01

回答

22

NSString文字符號@""爲您提供編譯時常量字符串,它們駐留在它們自己的內存空間中並具有常量地址。

與流行的看法相反,您不釋放文字字符串的原因並不是因爲它們是autorelease池的一部分。它們不是 - 相反,它們將整個應用程序的生命週期花費在它們在編譯時分配的相同內存空間中,並且永遠不會在運行時解除分配。只有當應用程序進程死亡時纔會刪除它們。

也就是說,唯一一次你需要記憶管理常數NSString s是當你自己保留或複製它們時。在這種情況下,您應該釋放保留或複製的指針,就像您做任何其他對象一樣。

另一件事:它是文字本身,不需要內存管理。但是,如果您將它們作爲參數傳遞給NSString的便利方法或初始化程序,就像您使用stringWithFormat:一樣,那麼正常情況下遵循所有內存管理規則的方法和初始化程序將返回這些對象。

+0

因此,當我的應用程序使用了很多內存時,使用@「」符號還是所有的NSString來到這個其他內存空間都不好?爲什麼我釋放用NSString創建的NSString,我可以跳過嗎(例如上面的對象名稱)? – Binarian 2011-05-20 09:05:19

+2

我不會責怪過度使用字符串,因爲它們的內存佔用量相對較低。如果你使用'stringWithFormat:'來創建字符串,它們*是* autoreleased。如果使用任何'init'方法創建字符串,則需要自己釋放它們(或稱爲'autorelease')。 – BoltClock 2011-05-20 09:07:33

+0

那麼爲什麼發佈,如果他們不真的被刪除,因爲他們留在自己的內存空間? – Binarian 2011-05-20 09:11:34

相關問題