今天在看書上的一段代碼時,發現NSString執行個體化時,有時用的是initWithFormat方法,有時用的是stringWithFormat,到底應該如何選擇呢?
區別:
1、initWithFormat是執行個體方法
只能通過 NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 調用,但是必須手動release來釋放記憶體資源
2、stringWithFormat是類方法
可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello World"] 調用,記憶體管理上是autorelease的,不用手動顯式release
另外國外有個貼子對此有專門討論(http://www.iphonedevsdk.com/forum/iphone-sdk-development/29249-nsstring-initwithformat-vs-stringwithformat.html)
而且提出了一個常見錯誤:
label.text = [[NSString alloc] initWithFormat:@"%@",@"abc"];
最後在dealloc中將label給release掉
但是仍然會發生記憶體流失!
原因在於:用label.text = ...時,實際是隱式調用的label的setText方法,這會retain label內部的字串變數text(哪怕這個字串的內容跟傳進來的字串內容相同,但系統仍然當成二個不同的字串對象),所以最後release label時,實際上只釋放了label內部的text字串,但是最初用initWithFormat產生的字串並未釋放,最終造成了泄漏。
解決辦法有二個:
1、
NSString * str = [[NSString alloc] initWithFormat:@"%@",@"abc"];
label.text = str;
[str release]
最後在dealloc中再[label release]
2、
label.text = [NSString stringWithFormat:@"%@",@"abc"];
然後剩下的事情交給NSAutoreleasePool
最後,如果你不確定你的代碼是否有記憶體流失問題,可以用Xcode中的Build-->Build And Analyze 做初步的檢查.