[英]ARC and Non-ARC NSString Initialization
最近,我一直在Objective-C / iOS程序中使用自動引用計數,並且真的很喜歡這個功能。
我不明白的一件事是初始化NSString
的正確方法。 我已經看到這種方法與ARC和非ARC項目一起使用:
NSString *myClassicString = [[NSString alloc] initWithFormat:@"My great non-ARC string!"];
我還發現以下方法可用於初始化ARC中的NSString
,我更喜歡它,因為它的方便性:
NSString *myARCString = [NSString stringWithFormat:@"My new simple initialization string!"];
這兩者有什么區別嗎? 有沒有正確的方法? 兩個更好嗎?
在ARC之前,兩種方法之間存在顯着差異。 第一個是alloc
init
方法,它產生了一個由調用者擁有的對象 - 它必須手動釋放,否則就會出現內存泄漏。 另一個是+stringWithFormat:
是一種方便的方法,可以生成一個不需要顯式釋放的自動釋放對象。
使用ARC,這種差異仍然很大。 自動釋放的對象仍然堆積,因為自動釋放池只在運行循環的每個循環中耗盡,即使使用ARC,所以如果你有一個循環創建了大量自動釋放的對象(即它們使用NSString方便方法或其他),你的峰值內存足跡可能上升。 出於這個原因,使用-alloc -init
版本更好。 過去,與ARC的差別很小。
這個答案很好地解釋了自動釋放池在這里發生了什么,Jon談到的概念仍然適用於ARC代碼,因為ARC沒有擺脫-retain
, -release
和-autorelease
,它只是插入那些你的內存管理代碼。
總而言之,您可能不需要擔心創建字符串的兩種方法之間的區別。 無論哪種感覺更好,並使更簡潔,易讀的代碼將是更好的方法。
要么就好了。 如果您手動管理內存,則會對它們進行不同的處理,但如果您使用ARC,則無關緊要。
兩種方法都是一樣的。 在NSString
初始化方面,沒有比另一個好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.