2009-07-11 2 views
2

데이터 객체 클래스가 있습니다.자기 자신이있는 속성에 액세스 할 때 내 프로그램이 중단되는 이유는 무엇입니까? 및 합성 접근?

@interface Item: NSObject { 
    NSString *title; 
    NSString *text; 
} 

@property (copy) NSString *title; 
@property (copy) NSString *text; 

@end 

@implementation Item 

@synthesize text; 

- (void)updateText { 
    [email protected]"new text"; 
} 

- (NSString *)title { 
    return title; 
} 

- (void)setTitle:(NSString *)aString { 
    [title release]; 
    title = [aString copy]; 
} 

@end 
비 합성 메서드를 사용할 때 title 속성을 올바르게 설정할 수 있지만 합성 된 접근 자로 속성을 설정하면 updateText 메서드에서 오류가 발생합니다. 읽습니다 :

[email protected]"new text"; 

오류 :

*** NSInvocation: warning: object 0x462d2c0 of class '_NSZombie_CFString' does not implement methodSignatureForSelector: -- trouble ahead 
*** NSInvocation: warning: object 0x462d2c0 of class '_NSZombie_CFString' does not implement doesNotRecognizeSelector: -- abort 

동일한 합성되지 않은 접근자는 작동하고 합성되지 않는 이유는 무엇입니까?

개체가 주 스레드에서 만들어지고 NSOperation 스레드에서 액세스 할 때 오류가 나타납니다.

답변

0

게시 한 코드는 저에게 맞습니다. 이 코드와 사용중인 실제 코드간에 다른 것이 있습니까?

표시되는 오류 메시지는 이미 릴리스 된 개체에 대한 포인터 인 "좀비"를 참조합니다. 이 코드의 어떤 것도 그러한 행동의 위험을 보여주지는 않습니다. 실제 오류가 다른 곳에서 발생한다고 생각하게 만듭니다.

가능한 해결책 중 하나는 Xcode의 디버거를 사용하여 NSString 개체의 주소를보고 해당 정보를 사용하여 어느 것이 결국 NSInvocation 경고가되는지 결정하는 것입니다.

[title autorelease] 
title = [aString copy]; 

그렇지 않으면 다른 스레드가 발 아래 발표 한 타이틀 개체를 얻을 수 있습니다

+0

개체가 주 스레드에서 만들어지고 NSOperation 스레드에서 액세스 할 때 오류가 나타납니다. – Rod

3

세터가 이런 식으로 코딩해야한다.

아니면 복사하기 전에이 출시 할 코드 [self setTitle:[self title]] 및 할당 해제 title에서 Memory Management Programming Guide for Cocoa

+2

자동 번역 작업을 낭비 할 필요가 없습니다. setter의 표준 코드는 새롭고 오래된 제목의 포인터 평등에 대해 단순히 방어합니다. if (title! = aString) {[title release]; title = [aString copy]; } –

+0

주의 : 문자열은 문자열이며 이유 때문에 복사하고 있습니다. title! = aString은 변경 가능한 문자열로 인해 실제로 불쾌해질 수 있습니다. – IlDan

+1

autorelease 접근 방식을 선호합니다. 적은 코드가 더 좋으며 성능 차이가 눈에 띄지 않는 시간은 99.9 %입니다. –

0

에서 다른 일관된 접근 스타일을 선택합니다. 세터에 title == aString이 있는지 확인해야합니다.

관련 문제