2011-06-01 49 views
0

在我的應用程序中,我想將一個數組中的自定義類複製到另一個數組中。所以我爲這個類實現了copyWithZone。 Xcode分析警告我,每行[alloc]或[copy]都在泄漏內存。我怎麼知道它是否真的在泄漏,或者它是我需要的複製實例?分析顯示copywithzone正在泄漏,是虛警嗎?

@implementation MyClass 

- (id)copyWithZone:(NSZone *)zone { 

    MyClass *copy = [[MyClass allocWithZone:zone] init]; 
    if (copy){ 
     copy.uniqueId = [uniqueId copy]; 
    } 

    return copy; 
} 
+0

你在這段代碼獲取分析警告,或警告表示其他的類文件嗎?如果是在另一個班級,請包含該代碼。 – 2011-06-01 14:36:13

+0

我試圖分析我的應用程序。一旦複製的對象從目標數組中移除,profiler將在此copyWithZone代碼中報告泄漏。 allocWithZone並複製兩行泄漏內存。 – leo 2011-06-02 03:20:14

回答

3

您的uniqueId屬性聲明爲保留屬性嗎?如果是這樣,這條線被泄露:

copy.uniqueId = [uniqueId copy]; 

將其更改爲:

copy.uniqueId = [[uniqueId copy] autorelease]; 
+0

太棒了!謝謝 – leo 2011-06-02 04:01:15

2

這是不正確的。

copy.uniqueId = [uniqueId copy]; 

也許應該

copy.uniqueId = self.uniqueId; 

這樣,你會得到正確的語義屬性不管它被聲明爲副本,保留或分配。

此外,我不打擾與copy != nil測試。發送setUniqueId:爲零是不適用的。

編輯

通過,如果

copy.uniqueId = [uniqueId copy]; 

泄漏的屬性保留或複製,因爲[uniqueId copy]爲您提供了自己的對象和不釋放或結束前自動釋放的方式範圍。

+0

然而,如果OP想要一個深層副本,那不會像他們想要的那樣工作。 – kubi 2011-06-01 14:38:23

+0

@kubi:itr會將該屬性聲明爲副本。如果該財產沒有被宣佈爲副本,那麼你可以爭辯說他們不想要一個深層副本。 – JeremyP 2011-06-01 14:41:25

+0

所以我認爲「這取決於」是正確的答案。 – kubi 2011-06-01 14:46:45