2010-03-12 24 views
14

我想知道是否需要釋放複製的NSObject?例如,我只創建一個,我複製到一個數組詞典:我需要釋放複製的NSObject嗎?Objective-c

代碼:

for (int num = 0; num < [object count]; num++) { 
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"]; 
    [array addObject:[dictionary copy]]; 
} 

我必須釋放字典?如果是,何時?

謝謝

+0

+1好問題 – andy

+3

就像經驗法則,在可可你必須發佈你擁有的任何東西。如果您使用新的,複製,分配或保留的方式發送消息,則您擁有一些東西。如果你沒有調用這些方法中的一種,那麼你不擁有它,你不應該釋放它。 –

回答

24

是的,你這樣做。在這種情況下,你應該放開副本將它添加到陣列後,因爲數組保留任何東西添加進去:

NSDictionary *copied = [dictionary copy]; 
[array addObject:copied]; 
[copied release]; 
+0

感謝您的信息! – ncohen

4

從文檔此片段:

- (ID)複製

返回值 由NSCopying協議方法copyWithZone:返回的對象,其中區域爲零。

討論 這是一種適用於採用NSCopying協議的便捷方法。如果沒有copyWithZone:的實現,則會引發異常。

NSObject本身不支持NSCopying協議。子類必須支持該協議並實現copyWithZone:方法。 copyWithZone:方法的子類版本應首先將消息發送到超級,以合併其實現,除非子類直接從NSObject下降。

特殊注意事項 如果您使用的是託管內存(而非垃圾回收),則此方法會在返回之前保留新對象。 然而,該方法的調用者負責釋放返回的對象。

0

很難說,沒有看到你在哪裏創建字典,無論這是否明智。如果在字典中沒有其他的成員,它會更簡單(雖然可以說是難以閱讀:)做類似

for (int num = 0; num < [object count]; num++) { 
    [array addObject:[NSDictionary 
          dictionaryWithObject:[object objectAtIndex:num] 
             forKey:@"x" 
        ] 
    ] 
} 

那將會給您的數組中真正的NSDictionary對象,而不是的NSMutableDictionary您正在創建的副本。

+0

你是以什麼理由聲稱NSMutableDictionary的副本不會是「* real * NSDictionary」? –

+0

理由是,如果您嘗試向其中插入對象,* real * NSDictionary將拋出錯誤。 – Jeff