2012-02-14 58 views
8

我很困惑,看着蘋果的文檔和閱讀可可設計模式。在蘋果文檔copyWithZone:,有這麼一句話:覆蓋copy或copyWithZone:或兩者?

這種方法存在這樣的類對象可以在 你需要一個符合NSCopying協議的對象的情況下使用。例如,對於 示例,此方法允許您使用類對象作爲NSDictionary對象的鍵。您不應該重寫此方法。

對於copy記載:

這對於採用NSCopying 協議類的便捷方法。如果 copyWithZone:沒有實現,則會引發異常。

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

在可可設計模式的例子,它們將覆蓋copyWithZone:mutableCopyWithZone:但符合NSCopying協議時不覆蓋copy。如果我想在NSDictionary中將我的自定義子類用作關鍵字,那我應該怎麼做?

還是我覆蓋copy

同樣,如果我做[myClass copy],那是否爲我的自定義子類調用copyWithZone:copy?謝謝。

回答

14

這很簡單:默認實現copy只是調用copyWithZone:與NULL參數。所以你應該始終執行copyWithZone:。但是,由於iOS上沒有使用內存區域(據我所知),您應該忽略該區域而不做任何假設。

編輯:闡述,您可以實現copy好,但你必須實現因爲copyWithZone:你永遠不知道他們的NSDictionary將iOS中調用6

0

您可以繼續使用超方便方法,因爲它在任何情況下什麼都不做,只能撥打copyWithZone:

對任何方便的方法都應該如此。你應該找出他們所調用的方法並改寫它。

同樣如上所述,根本不再使用區域,但爲了兼容性和歷史原因,該方法仍具有該參數。