2010-12-04 63 views
2

所以我有2個對象。copyWithZone被稱爲

Library.h: 
    NSString *name; 
    Book *book; 

Book.h: 
    NSString *title 
    NSString *author; 

的屬性都設置爲(讀寫,拷貝)

ViewController.h: 
    Library *library; 
    Book *book; 

ViewController.m: 
    library = [[Library alloc] init]; 
    book = [[Book alloc]init]; 


    //The fallowing all works 
    library.name = @"Library Name"; 
    book.title = @"book Title"; 
    book.author = @"book author"; 

//The fallowing crashes my app 
library.book = book; 

我怎樣才能封裝圖書庫對象的內部?

調試器給我一個下面的錯誤。

[庫copyWithZone:]:無法識別選擇

回答

3

的-copyWithZone:選擇被調用,因爲你分配一個對象被標記爲(副本)的屬性。將它標記爲(複製)會告訴編譯器以您的名義創建一個設置器,以嘗試複製分配的對象。

您或者需要將您的屬性標記爲(readwrite,retain),以便保留Book的現有實例而不是製作副本,或者需要爲Book類實現NSCopying協議。下面是蘋果的NSCopying文檔:

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40003777

不管是更改屬性的屬性或採用NSCopying協議取決於你是否真的需要拷貝被分配的對象(通常只需要被分配對象時會被修改和可能會被調用者或其他人改變),或者只是保留對現有對象的引用(被認爲是正常情況)就可以逃脫。

+0

這表示感謝。 – endy 2010-12-04 00:59:17