2011-05-31 256 views
0

我是否必須釋放returnSet變量?我是否需要釋放此對象?

NSMutableSet* returnSet = [[NSMutableSet alloc] init]; 
    for (Information* currentInformation in self.information) { 
     if ([currentInformation.player isEqual:aPlayer]) { 
      [returnSet addObject:currentInformation]; 
    } 
} 
return [NSSet setWithSet:returnSet]; 

謝謝您的回答, 基督教

+1

你接受一個錯誤的答案。 @bensnider提出了一個非常好的解決方案,你的'returnSet'實例在被同時保留的同時被自動釋放。該方法將需要顯式釋放「自動釋放」對象。看看Apple的api,他們不會返回保留的對象,除非在特定情況下(如-init,-retain,-copy),這些行爲是可取的。但它會一直手動管理。有很多錯誤的角度,我在我個人收集的錯誤StackOverflow接受的答案中添加此問題。 – bioffe 2011-05-31 16:52:52

回答

4

通常,當編寫一個返回新創建對象的方法時(如您的示例),您應該返回一個自動釋放的對象。因此,按照慣例,您的代碼將變成:

NSMutableSet* returnSet = [[NSMutableSet alloc] init]; 
    for (Information* currentInformation in self.information) { 
     if ([currentInformation.player isEqual:aPlayer]) { 
      [returnSet addObject:currentInformation]; 
    } 
} 
return [returnSet autorelease]; 

注意,您可以從即使你的方法簽名指定的NSSet方法返回的可變集,因爲一個是的NSMutableSet的NSSet中的子類。當你使用這個方法的時候,如果你不想讓返回的對象繼續存在,就不要做任何事情,它會被釋放。如果您希望以後可以訪問它,請將其分配給一個成員變量並保留它,或將其放入另一個保留的數據結構(set,dictionary,array)中。

更新 澄清一些明顯的混亂作爲此答案的正確性,請參考「從方法返回對象」在http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html

+0

嗯。我認爲你錯了,你的代碼會造成內存泄漏。 – bioffe 2011-05-31 16:15:46

+0

@bioffe不,@ bensnider完全正確。 – gcamp 2011-05-31 17:38:43

+0

你提到的文章的第一段證明了我的觀點。然而,第二個例子(您提出的相同技術)明確表示爲正確。在這種情況下,手冊是錯誤的,並創建一個內存泄漏(不會第一次btw)。它與第一段相矛盾,該段說「你應該使用自動釋放而不是釋放來放棄所有權。」讓我們問@bbum,他應該知道。 – bioffe 2011-05-31 18:36:16

3

是。一般來說,如果你alloc呢,你要麼需要release吧,要麼autorelease吧。

2

是的,你分配它(你擁有它),所以你需要釋放它。

1

是的。這是內存泄漏。您需要創建NSSet結果變量,釋放returnSet並返回結果。

+0

小修正:'release returnSet'應該是'autorelease returnSet'。 – csano 2011-05-31 16:07:44

+0

@ j0k錯了,你不應該那樣做。 – bioffe 2011-05-31 16:17:44

0

是的,你可以。你可以做一個簡單的自動釋放這樣的:

[returnSet autorelease]; 
return returnSet; 

使用自動釋放給你時間返回的值分配給其他在調用此函數的東西。在調用函數可以對返回執行任何操作之前,立即釋放會釋放對象。自從它在這個函數中被創建以來,它也是處理這個函數中的自動釋放的好習慣。它讓生活變得更容易,而不必每次調用此函數時都要記住釋放。

0

@bensnider是絕對正確的 - 返回一個autoreleased對象。

不過,我個人更喜歡返回一個不可改變的集合,以防止意外發生以後:)

我會被誘惑寫:

NSMutableSet *returnSet = [[NSMutableSet set]; 
    for (Information* currentInformation in self.information) { 
     if ([currentInformation.player isEqual:aPlayer]) { 
      [returnSet addObject:currentInformation]; 
    } 
} 
return [NSSet setWithSet:returnSet]; 

然後ResultSet是和一個隱含的自動釋放,以便創建不需要擔心它,並且你正在返回一個不可變的對象。

(雖然這樣做的缺點是你正在兩套 - 可能不是一個問題,但如果這種方法被調用很多次,你可能要重新考慮我的答案!)

相關問題