2011-09-26 32 views
2

我有一個NSArray的MyObjects。有關複製NSArray的最後一個對象的問題

我想複製我的數組的最後一個對象。換句話說,我想向數組中添加一個新的對象,它與最後一個完全相同。

我試着用:

id object = [[self arrangedObjects] lastObject]; 
id newObject = [object copy]; 

但我意識到,我不能用複製的方法,因爲它不是在NSObject的實現。

我應該實現的MyObject類的複製方法,返回MyObject來的新實例,並更改代碼如下:

MyObject object = [[self arrangedObjects] lastObject]; 
MyObject newObject = [object copy]; 

還是有其他solutoins?

UPDATE 從NSObject的文檔

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

回答

0

據我知道,如果你要複製的對象,落實NSCopying協議,它可以讓你使用NSObject- (id)copy方法。

- (id)copyWithZone:(NSZone *)zone方法,分配使用+ (id)allocWithZone:(NSZone *)zone那麼它的成員複製一個新對象,更新其狀態,等等

+0

它說選擇器副本無法識別。我在NSObject拷貝文檔中發現了這一點:NSObject本身不支持NSCopying協議。子類必須支持該協議並實現copyWithZone:方法。 copyWithZone:方法的子類版本應首先將消息發送到超級,以合併其實現,除非子類直接從NSObject下降。 – aneuryzm

+0

該文檔說:如果沒有對copyWithZone:的實現,則會引發異常。這必須是你無法識別的選擇器:) NSObject必須做額外的驗證 – Geoffroy

+0

回答我的問題..我不能用NSObject複製,但我需要繼承它並使用MyObject類來實現NSCopying協議。正確嗎? – aneuryzm

1

如果你的對象是NSObject的,可以使一個實現NSCopying協議一個新的NSObject的類別。一定要遍歷所有鍵並將它們的值複製到新對象。對於深層複製,您還應該在其每個值對象上調用「複製」。

如果您的對象是自定義的,請在其類中實現該協議。

如果在數組中有混合對象,則它們都必須實現NSCopying協議,因此在聲明它們時可以使用id <NSCopying>以避免編譯時警告/錯誤。