2011-03-22 69 views
0

我的代碼如下。iPhone - 釋放內存問題 - 內存泄漏

- (void)viewDidLoad 
{ 
NSArray* myarr = [self createArray]; 
for (NSString* str in myarr) 
{ 
    NSLog(@"%@",str); 
} 
[myarr release]; 
} 

-(NSArray*)createArray 
{ 
NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil]; 
return arr1; 
} 

當我 「建設&分析」,它顯示了兩個泄漏。一位在[myarr發佈]中說,此時擁有的對象的引用計數不正確減少。和其他在返回arr1,說,在線152上分配的對象的潛在泄漏,並存儲到arr1。

從我上面的代碼中,方法「createArray」返回一個指針,我也發佈它。我的編碼方式是對還是錯?

回答

1

從我上面的代碼中,方法「createArray」返回一個指針,我也發佈它。我的編碼方式是對還是錯?

這取決於你如何看待它。

1)裁判計數看起來基於名稱確定

2)靜態分析標誌objc方法,在某些情況下。所以如果您將createArray重命名爲newArray,或者將其命名爲new*,問題可能會消失。所以它預計會遵循一個慣例(Apple使用的慣例)。因此,它的信息有點淺薄,它並不真正分析程序,而是將其發現/結果建立在約定基礎上 - 而不是一個人類可以閱讀的實際明顯問題。

0

試試這個

- (void)viewDidLoad 
{ 
NSArray* myarr = [[NSArray alloc] initWithArray:[self createArray]]; 
for (NSString* str in myarr) 
{ 
    NSLog(@"%@",str); 
} 
[myarr release]; 
} 

-(NSArray*)createArray 
{ 
NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil]; 
return [arr1 auotrelease]; 
} 

與您的代碼的問題是,

  1. 你使用allocnew所以你不採取對象的所有權不分配myarr。因此這個問題在發佈。

  2. 您分配arr1,以便您獲得對象的所有權並返回arr1。因此你不會釋放它。這是泄漏的原因。

+0

他的代碼沒有任何泄漏。靜態分析器不夠智能來實現這一點。您提供的代碼不必要地創建兩個數組。 – imaginaryboy 2011-03-22 05:36:41

1

如果你只是在你的viewDidLoad方法中使用數組,那麼你根本不需要在那裏分配一個數組。您可以使用建議的7KV7返回的自動釋放陣列。你可以在你的 - (void)createArray中返回一個自動釋放數組,而不需要分配一個對象。這是一個例子。

- (void)viewDidLoad 
{ 
NSArray* myarr = [self createArray]; 
for (NSString* str in myarr) 
{ 
    NSLog(@"%@",str); 
} 
} 

-(NSArray*)createArray 
{ 
return [NSArray arrayWithObjects:@"APPLE",@"MAC",@"IPHONE",nil]; 

} 

如果你不需要分配一個對象來使用它,它會減少和更簡潔的代碼IMO。

+0

我知道這一點。但我基本上想知道爲什麼編譯器給我的代碼泄漏錯誤。請看賈斯汀的回覆。任何方式感謝您的答覆。 – Satyam 2011-03-22 05:34:39