2010-12-04 2 views
2

그래서 2 개체 있습니다.copyWithZone을 호출 중

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

Book.h: 
    NSString *title 
    NSString *author; 

속성은 모든으로 설정되어 있습니다 (READWRITE, 복사)

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 :] : 인식 할 수없는 선택

-copyWithZone

답변

3

: 당신이 (사본)로 표시되는 속성에 객체를 할당하고 있기 때문에 선택 호출되고있다. 이것을 (copy)로 표시하면 컴파일러가 할당 대상 객체의 복사본을 만들려고 설정자를 만들도록 지시합니다.

복사본을 만들지 않고 기존의 책 인스턴스를 유지하거나 Book 클래스에 NSCopying 프로토콜을 구현해야하므로 속성을 (readwrite, retain)으로 표시해야합니다. 여기 NSCopying에 대한 애플의 설명서 : 당신이 등록 정보 속성을 변경하거나 NSCopying 프로토콜을 채택 여부

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

은 당신이 진정으로 객체가 할당 될 때 객체가 (보통 필요한 할당되는 복사해야하는지 여부에 따라이 수정되고 호출자 또는 다른 사람이 변경할 수 있음) 기존 객체에 대한 참조를 유지하는 것만으로도 벗어날 수 있습니다 (일반적인 경우로 간주).

+0

감사합니다. – endy

관련 문제