2010-12-04 4 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クラスのNSCopyingプロトコルを実装する必要があります。ここでNSCopying上のAppleのドキュメントがあります:割り当てられているオブジェクトが変更されたときに

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

関連する問題