最近在做程序的時候,突然發現對于NSString的理解還是存在問題的。因此補充一片blog,希望對剛剛進入OC開發并搞不清楚內存泄露問題的人一點指引。
賦值:
NSString * str = @"123"; // 這段代碼的含義其實就是附一個常量給str,該部分由系統自動管理,不需要release釋放,是會autorelease的。
NSString * str = [[NString alloc] initWithString :@"111"]; // 這種寫法本身存在問題,因為這個代碼的含義是說給str附一個常量,因此會被編譯器優化,因此也是不需要release的,盡管有alloc出現。
NSString * str = [[NSString alloc] initWithFormat:@"123"] ;// 必須要進行release才可以,因為這樣就會導致內存泄露。
NSString * str = [[NSString stringWithFormat:@"111"];// 則個不需要release,也不會產生內存泄露,因為該部分調用的是系統的類方法,也就是會autorelease。這種方法其實也被稱之為臨時的變量使用方法。
補充一點內容:
1、initWithFormat是實例方法
只能通過 NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 調用,但是必須手動release來釋放內存資源
2、stringWithFormat是類方法
可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello World"] 調用,內存管理上是autorelease的,不用手動顯式release
經常在uilable的填寫中,使用到字符串,因此也就非常容易造成內存泄露。比較正確的方法如下兩種:
解決辦法有二個:
1、
NSString * str = [[NSString alloc] initWithFormat:@"%@",@"abc"];
label.text = str;
[str release]
最后在dealloc中再[label release]
2、
label.text = [NSString stringWithFormat:@"%@",@"abc"];
另外,對于函數調用,也會經常用到nsstring作為一個返回值。因此一個比較正確的函數的處理方法如下:
一個方法,返回一個NSString對象,在事件中調用方法.并嘗試release 方法返回的NSString對象.
- <span style="color:#454545">-(NSString*) createNewString{
- //情況1 -</span><span style="color:#ff0000">- 需要自己釋放</span><span style="color:#454545">。
- return [[[NSString alloc] initWithFormat:@"%@",@"1223344"] autorelease];
- //情況2 -</span><span style="color:#ff0000">- 系統自動釋放。 這種方法因為不安全,并且存在含義模糊的情況,不建議使用。</span><span style="color:#454545">
- return [[[NSString alloc] initWithString:@"1223344"] autorelease];
- // 情況3 -</span><span style="color:#ff0000">- 系統自動釋放。</span><span style="color:#454545">
- return @"1223344";
- }</span>
- 原文http://blog.csdn.net/dongdongdongjl/article/details/8471995
文章列表