2010-12-04 41 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