2011-08-01 6 views
2

現在、必要な属性を入力してエンティティを設定しようとしています。私は、XML応答を解析し、それらが出現するときに属性を割り当てることによってこれをやっています。私が実行している問題は、型の不一致が原因で、属性セット関数が「関数に送信されたセレクタが正しくありません」というエラーが発生するということです。私はデバッガに入って、常にcustEntity.name属性に割り当てる前に、自分のタイプがNSStringではなくNSCFStringであるように見えることに気付きました。私はいくつかの検索といくつかのテストを行い、自分の修正を試みましたが、どこにも行けませんでした。関連するコードとその効果を以下に示します。コアデータ:Entity.Attribute、タイプの問題を設定する

私の他のエンティティ定義を一つのファイルに生成され、合わせて自動、DataModelObject.h:

@interface Checkpoint : NSManagedObject { 
    @private 
} 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSNumber * lat; 
@property (nonatomic, retain) NSNumber * lon; 
@property (nonatomic, retain) NSManagedObject * myRoute; 
@end 

DataModelObject.m

私の現在のコードは、提案の結果としてどのように見えるか
@implementation Checkpoint 
@dynamic name; 
@dynamic lat; 
@dynamic lon; 
@dynamic myRoute; 
@end 

NSString *chkptName = [attributeDict objectForKey:@"name"]; 
checkpoint.name = [[NSString stringWithString:chkptName] stringValue]; 

T他の誰かに彼はObjective-cとiPhone開発には新しくて、私は知らないので、それは必要な場合もありますが、これはうまくいかないことがあります。 2行目の実行の前に、chkptNameの値は人間が読める正しい文字列で、割り当てたい文字列です。理論的には、2行目を正しく理解すれば、NSStringをckptNameの値で再宣言し、chkptNameの値を取得するのと同じでなければならないstringValueでその実際の値を再度読み込みます。しかし、私のアプリがsigAbrtでクラッシュし、変数の値をチェックしようとすると、NSCFString型の値が無効であることがわかります。この時点で私はこれを解決する方法を失っています。私はエンティティの属性を正しく変更していますが、以前はこの問題に遭遇していませんでした。

また、おそらくはるかに単純な私はこれを始めたことは注目に値する:

checkpoint.name = [attributeDict objectForKey:@"name"]; 

しかし、これは同じSIGABRT、誤った選択エラーを生じました。

編集:要求されたように完全なエラー:

2011-08-02 07:25:00.544のMyApp [16011:207] - [NSCFStringのstringValue]:未認識セレクタインスタンスに送信0x5c174e0 2011-08-02 07 :25:00.545のMyApp [16011:207] *によりキャッチされない例外 'NSInvalidArgumentException'、理由にアプリを終了は: ' - [NSCFStringのstringValue]:未認識セレクタインスタンス0x5c174e0に送ら'

EDIT2:デバッガ出力:

(gdb) po checkpoint 
<Checkpoint: 0x5a30730> (entity: (null); id: (null) ; data: {}) 
(gdb) po [checkpoint class] 
Checkpoint 
(gdb) po [checkpoint entity] 
Can't print the description of a NIL object. 

私が逃した関連するコードがある場合は、あなたが提供できる明確化は大いにありがたいです。もし可能であれば、私はそれを提供してくれるでしょう。ありがとう!

-Karoly

答えて

1

私はあなたが注意を見て、あなたのcheckpoint変数が本当にCheckpointクラスのインスタンスであることを確認すべきだと思います。

  1. コアデータモデルでクラスが適切に設定されていることを確認してください。
  2. 実行時にブレークポイントを設定し、オブジェクトをデバッガで印刷します。po checkpoint
  3. オブジェクトの実行時に、po [checkpoint entity]でオブジェクトのエンティティを確認します。
+1

また、 'po [checkpoint class]'を使用して、どのタイプのクラスであるかを確認することもできます。 –

+0

私は先に進み、結果をプリントアウトして質問を編集しました。 [チェックポイントエンティティ]は問題ではないと思われますが、値を変更するために何も設定できないため、わかりません。私はチェックポイント変数を2行前にあらかじめ割り当てる。 –

+0

@Karol S - これは、 'Checkpoint'インスタンスがエンティティ記述で正しくインスタンス化されていないことを示唆しています。 'Checkpoint'クラスのような新しいマネージオブジェクトをインスタンス化するには' + [NSEntityDescription entityForName:inManagedObjectContext:] 'を使用しますか? – PeyloW

1

だから、質問は既に答え、多分今後の参考のためにされてきたようだ:

あなたは、このようなエラーが出た場合:

2011-08-02 07:25:00.544 MyApp[16011:207] -[NSCFString stringValue]: unrecognized selector sent to instance

それは実際に見てかなり便利ですそれが何を言っているのか:

unrecognized selector sent to instanceは、オブジェクトが応答できない、またはわからないというメッセージを受信したことを意味します。

-[NSCFString stringValue]には、送信されたメッセージ(stringValue)と送信されたオブジェクト(NSCFString)が表示されます。

我々はそれが何からオブジェクトのメッセージstringValueを呼び出す唯一の場所(」のようですので、あなたが

checkpoint.name = [[NSString stringWithString:chkptName] stringValue]; 

を呼び出したときにエラーがおそらく起こっていることがわかり、エラーでメッセージから投稿されました)。 NSCFStringは、単にNSStringのサブクラスです。

NSStringstringValueと電話することはできません(これも意味があります)。わかりましたが、私が読んだところでは、この問題はすでに解決されています。 :)

+0

遅延Octoshapeのため申し訳ありませんが、私は質問の最後に完全なエラーを掲載しました。 –

+0

@ Karoly S私の返信を編集し、このような別のエラーで実行すると便利な情報を追加しました。これが将来あなたを助けてくれることを願っています:)問題を解決できたらうれしいです! – Octoshape