2011-08-15 6 views
1
にキャストする

私は、別の管理対象サブクラスのカードと多対多の関係を持つTagという管理オブジェクトサブクラスを持っています。私のコードでは、ストアからTagを取得し、関連するCardオブジェクトにアクセスして配列に追加します。私はまた、配列に追加される別のマネージオブジェクトサブクラスCardVariationを持っています。NSManagedObjectのサブクラスをプロトコル

Cardと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に応答する場合、コードは関係なく動作します。

これの出力は何ですか?

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

あなたが期待しているクラス(例えば<Card: 0x4e72090> (entity: Card; ...)を取得しない場合、あなたは間違ったクラスのインスタンスを持ってここでチェックするには、2つのものです:。

  1. があなたのサブクラスを確認してください.mファイルやデータモデルは、ソースをコンパイルターゲットのために>ビルドフェーズに記載されています。データモデルで

  2. 、エンティティの下で、あなたのサブクラスは、クラス、およびないNSManagedObjectとしてリストされていることを確認してください。

+0

'(エンティティ:カード; id:0x4e5a590 ;データ:) ' – Tom

+0

申し訳ありませんが、それはオブジェクトxでした。クラスNSManagedObjectです – Tom

+0

ええ - それは間違っている。あなたは '(エンティティ:カード; ...)'を見ているは​​ずです。 – paulmelnikow

関連する問題