2012-02-20 132 views
2

試圖執行NSCopying的第一次,我有一個關於NSZone的subleties問題:我可以使用兩次相同的NSZone嗎?

- (id)copyWithZone:(NSZone *)zone { 
    MyClass *copy = [[[self class] allocWithZone:zone] init]; 

    copy.array = [[self.array mutableCopyWithZone:zone] autorelease]; 

    return copy; 
} 

在這個例子中,我使用的是NSZone兩次:第一次分配的對象,然後重新分配數組的副本。這合法嗎?有必要嗎?我可以簡單地做mutableCopy,我也在使用-initWithArray:copyItems:作爲一種可能的選擇。

最好的方法是什麼?在「我是否需要生成的數組的對象是淺層還是深層拷貝?」這個問題上隨意採取任何一種方式?對我來說關鍵是兩次使用NSZone是否安全。

回答

3

從同一個區域創建多個對象正是發明了哪些區域。這個想法是你可以創建一個區域,並從該區域創建一個或多個對象(並且它們可以創建任何相關對象),然後你可以銷燬該區域,從而銷燬其中的所有對象。

問題在於,這與引用計數的概念(即所有權)不相容。如果你吹走一個包含一個或多個對象的區域(即仍然能夠使用),事情就會崩潰。如果所有這些物體在你毀壞該區域時已經被其所有者釋放了,則它們已經被一次性釋放一次,所以該區域什麼都不做,因此是不必要的。

因此,儘管您可能仍然喜歡按照文體一致性的原則進行操作,但它不會在運行時發生什麼顯着差異。

+0

嗨,你沒有問題是正確的,謝謝。您能否詳細說明這會如何影響NSCopying?我現在比以前更*迷惑了。符合NSCopying的原因是你可以說[aDictionary setObject:x forKey:myNSCopyingObject]。你對NSZone的評論帶來了如何正確符合協議的問題。顯然,我剛開始使用Apple模板,他們顯然沒有更新。 – SG1 2012-02-20 03:36:09

+0

@ SG1:複製和創建原始對象一樣。你可以使用區域,至少在名義上(因爲區域不再有任何真正的事情),或者假裝區域不存在,只需在你的實現中使用'alloc' /'copy' /'mutableCopy'即可。你的選擇。 – 2012-02-20 03:41:57

相關問題