2012-11-01 5 views
2

나는 objective-c에 익숙하지만 수년간 코딩하고 있습니다. 어쨌든 Objective-C로는 따뜻하지 않습니다. 구글과 stackoverflow 검색,하지만 내 문제는 아무도 아직이 질문을 단순하고 어리 석다 생각합니다.Objective-C 속성 액세스 : 인스턴스로 전송 된 인식 할 수없는 선택 자

내 코드는 DateSelectionTitles 예제를 기반으로합니다. http://developer.apple.com/library/ios/#samplecode/DateSectionTitles/Introduction/Intro.html

내가 가진 NSManagedObject

@interface Event : NSManagedObject 

@property (nonatomic, retain) NSDate * date; 
... 

// Cache 
@property (nonatomic, retain) NSString * primitiveSectionIdentifier; 

모든 특성 결정이

(사과의 예에서와 같이) primitiveSectionIdentifier 제외하고, 내 데이터 모델에 정의하지만되어 나는

NSString *tmp = [self primitiveSectionIdentifier]; 

I를 호출 할 때 예외를 얻으십시오

Termina 캐치되지 않는 예외 'NSInvalidArgumentException', 이유 때문에 팅 응용 프로그램 : - : 간단하게 말하면

'[이벤트 primitiveSectionIdentifier] 인식 할 수없는 선택기 인스턴스 0x74850c0로 전송'

Event *foo = [[Event alloc] init]; 

if (foo.primitiveSectionIdentifier) { 
    NSLog(@"YEAH"); 
} 

이 같은 예외가 발생합니다. 그래서 기본적으로 primitiveSectionIdentifier가 nil인지 확인하려고합니다. 하지만 속성에 액세스하면 예외가 발생합니다. 값이 있는지 확인하기 전에 각 속성을 할당해야합니까?

Objective-C 기본 사항 중 내가 여기에 표시되지 않는 것은 무엇입니까?

답장을 보내 주셔서 감사합니다.

+5

'@synthesize primitiveSectionIdentifier;를'@ implementation' 섹션에 작성 했습니까? –

+2

경고없이 컴파일되는 코드가 있습니까? – rmaddy

+0

Xcode 4를 사용하는 경우.5 컴파일러는 합성하지 않는 것에 대한 경고를 표시하지 않습니다 (@synthesize 속성). 대신 self.primitiveSectionIdentifier를 사용해보십시오. Xcode 4.5 릴리스 노트에서 언급 됨 https://developer.apple.com/library/mac/#releasenotes/DeveloperTools/RN-Xcode/_index.html –

답변

1

컴파일러 경고없이 이것이 일어날 수있는 유일한 방법은 구현 파일에 @dynamic primitiveSectionIdentifier;입니다. 즉, 메소드가 이미 다른 곳에 정의되어 있다고 생각하기 때문에 메소드를 정의하고 싶지 않습니다.

NSManagedObject을 사용하고 있는데 어떻게 작동하는지 알고 계십니까? 구현하지 않고 (구현에 @dynamic을 넣음) 메소드를 선언하면 메소드가 호출 될 때 해당 메소드가 발견되지 않고 특별한 핸들러 [NSObject doesNotRecognizeSelector:]이 대신 호출됩니다. 이 핸들러는 코어 데이터 모델을 검사하여 주어진 selector의 속성이 존재하는지 여부를 확인하고, 존재하지 않으면 예외를 던집니다.

따라서이 문제는 primitiveSectionIdentifier이 (가) 모델에서 선언되지 않았기 때문에 발생할 수 있습니다.

+0

고마워요, 그 속임수를했습니다. 나는 primitiveSectionIdentifier를 합성했다. 그리고 효과가있었습니다. 나는 XCode 4에서 synthesize가 자동으로 수행된다고 생각했다. 속성에 대해 동적으로 설정된 경우에는 분명히 아닙니다. – user1792043

+0

정확히 내 상황이지만 problem 속성이 실제로 내 모델에서 선언되었습니다. 내가 무엇을 할 수 있을지? –

+0

@ 설화 : 통찰력을 가져 주셔서 감사합니다. 그러나, 제 경우에는 액세스 할 속성이 내 모델에 정의되어 있지만 아직 속성에 저장된 데이터가 없습니다. iOS 9.2를 사용하고 있습니다. – moonman239

1

다른 메모리 관리 스타일을 사용하는 이전 예제 프로그램을 사용하고 있습니다. iOS 5 또는 6에서 컴파일하는 경우 문제가 발생할 수 있습니다. 그것은 당신에게 문제가 문자열 객체가 초기화되지 않았다 여전히 전무로 설정되어 있다는 점에서 가능성이 당신이 다음 찾고있는 문자열을 제공하지 않는 경우

NSLog(@"primitiveSectionIdentifier = %@", self.primitiveSectionIdentifier); 

을보십시오. 이 상황에서 코드는 컴파일되지만 nil 포인터에 선택기를 보내면 예외가 발생합니다.

+0

셀렉터를'nil'으로 보내면 절대로 예외가 발생하지 않습니다. 이것은 또한 메모리 관리와 관련이 없습니다. MRC는 여전히 유효하며 널리 사용되고 있습니다. – Sulthan

관련 문제