2011-08-15 3 views
1
으로 캐스팅합니다.

다른 관리 대상 하위 클래스 카드와 다기간 관계가있는 Tag라는 관리 객체 하위 클래스가 있습니다. 내 코드에서 저장소에서 Tag를 검색 한 다음 관련 Card 객체에 액세스하여 배열에 추가합니다. 또한 배열에 추가되는 다른 관리 대상 객체 하위 클래스 인 CardVariation이 있습니다.NSManagedObject 하위 클래스를 프로토콜

카드와 CardVariation 모두 TaggedCard 프로토콜을 준수합니다. 내가 배열에 저장된 개체에 액세스 할 때, 나는 TaggedCard 프로토콜에 캐스팅 :

id<TaggedCard> x = (id<TaggedCard>)[theArray objectAtIndex:i]; 

내가 다음 개체에 TaggedCard 메시지를 보내려고 :이 실행되면

NSString *y = [x taggedCardName]; 

, 내가 할 예외 :

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[NSManagedObject taggedCardName]: unrecognized selector sent to instance 0x4e7c620' 

카드 (또는 CardVariation)에 문제없이 캐스팅 할 수 있습니다. 프로토콜에 관리 객체 하위 클래스를 캐스팅하는 데 특별한 것이 있습니까?

답변

1

x가 예상 한 클래스의 인스턴스가 아닌 것처럼 들립니다. 캐스트는 컴파일러 경고를 피하지만, 인스턴스 x가 taggedCardName에 응답하면 코드는 상관없이 작동합니다.

이 결과는 무엇입니까? 당신은 당신이 (예를 들어 <Card: 0x4e72090> (entity: Card; ...)에게 기대하고있는 클래스를 얻지 않는 경우에

NSLog(@"%@", [x class]); 

, 잘못된 클래스의 인스턴스가 현재 위치를 확인하기 위해 두 가지 :.

  1. 하는 하위 클래스 확인을 하는 .m 파일 및 데이터 모델은 컴파일 소스 대상에 대한> 빌드 단계에서 나열되어 있습니다. 데이터 모델에서

  2. , 엔티티에 따라, 하위 클래스는 클래스, 그리고 NSManagedObject로 표시되어 있는지 확인하십시오.

+0

' (엔티티 : 카드; id : 0x4e5a590 ; 데이터 : ) ' – Tom

+0

죄송합니다, 그것은 객체 x였습니다; 클래스는 NSManagedObject – Tom

+0

예 - 그게 잘못입니다. 당신은' (엔티티 : 카드; ...)'를보아야합니다. – paulmelnikow

관련 문제