copyWithZone被调用

时间:2010-12-04 00:07:33

标签: objective-c class ios sdk

所以我有2个物体。

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

Book.h:
   NSString *title
   NSString *author;

属性都设置为(readwrite,copy)

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;

如何将Book封装在库对象中?

调试器给了我一个错误的错误。

[library copyWithZone:]:无法识别的选择器

1 个答案:

答案 0 :(得分:3)

正在调用-copyWithZone:选择器,因为您正在将对象分配给标记为(copy)的属性。将其标记为(复制)会告诉编译器代表您创建一个setter,它会尝试复制正在分配的对象。

您需要将属性标记为(readwrite,retain),以便保留Book的现有实例而不是制作副本,或者需要为Book类实现NSCopying协议。这是Apple关于NSCopying的文档:

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

是否更改属性属性或采用NSCopying协议取决于您是否确实需要复制所分配的对象(通常仅在被分配的对象可修改且可由调用者或其他人更改时才需要),或者只需保留对现有对象的引用(被认为是正常情况)就可以逃脱。