文章出處

最近在做程序的時候,突然發現對于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對象.

[objc] view plaincopy
 
  1. <span style="color:#454545">-(NSString*) createNewString{  
  2.     //情況1 -</span><span style="color:#ff0000">- 需要自己釋放</span><span style="color:#454545">。  
  3.     return [[[NSString alloc] initWithFormat:@"%@",@"1223344"] autorelease];  
  4.    //情況2  -</span><span style="color:#ff0000">- 系統自動釋放。 這種方法因為不安全,并且存在含義模糊的情況,不建議使用。</span><span style="color:#454545">  
  5.     return [[[NSString alloc] initWithString:@"1223344"] autorelease];  
  6.    // 情況3 -</span><span style="color:#ff0000">- 系統自動釋放。</span><span style="color:#454545">  
  7.    return @"1223344";  
  8. }</span>  
  9. 原文http://blog.csdn.net/dongdongdongjl/article/details/8471995

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()