簡體   English   中英

我需要釋放這個 object 嗎?

[英]Do I need to release this object?

我必須釋放 returnSet 變量嗎?

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

謝謝你的回答,克里斯蒂安

通常,在編寫返回新創建的 object 的方法時(如您的示例所示),您應該返回自動發布的 object。 因此,按照慣例,您的代碼將變為:

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 的子類。 當您使用此方法時,如果您不希望返回的 object 繼續存在,則什么也不做,它將被釋放。 如果您希望以后可以訪問它,請將其分配給成員變量並保留它,或者將其放置在另一個保留的數據結構(集合、字典、數組)中。

更新要消除關於此答案正確性的一些明顯混淆,請參閱http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/MemoryMgmt/Articles上的“從方法返回對象”部分/mmPractical.html

是的。 一般來說,如果你alloc它,你要么需要release它,要么需要autorelease它。

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

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

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

[returnSet autorelease];
return returnSet;

使用 autorelease 可以讓您有時間將返回的值分配給調用此方法的 function 中的其他內容。 在調用 function 可以對返回做任何事情之前,立即釋放將釋放您的 object。 在此 function 中處理自動釋放也是一個很好的做法,因為它是在此 function 中創建的。 它使生活變得更輕松,而不必記住每次調用此 function 時都要釋放。

@bensnider 是絕對正確的——返回一個自動發布的 object。

但是,我個人更喜歡返回一個不可變的集合以防止以后發生事故:)

我很想寫這個:

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

然后使用隱式自動釋放創建 resultSet,因此您無需擔心它,您將返回一個不可變的 object。

(雖然這樣做的缺點是您要制作兩組 - 可能不是問題,但如果多次調用此方法,您可能需要重新考慮我的答案!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM