0

User を宣言し、これらの変数を含むクラスがあります。

(User.h ファイル):

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * unid;

(User.m ファイル):

@dynamic name;
@dynamic unid;

文字列を解析して値の配列を取得しています。次に、それに応じて値を設定します。

(ViewController.m ファイル):

[user setName:[returned objectAtIndex:1]];
[user setUnid:[returned objectAtIndex:2]];

これを実行すると、コンパイラは次のエラーを表示します。

unrecognized selector sent to instance
*** WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSInvalidArgumentException> -[User setName:]: unrecognized selector sent to instance

setName 行をコメントアウトすると、正常に機能します。

次に、返された配列から 2 つのオブジェクトのクラスを調べたところ、どちらも次のようになりました。__NSCFString

次に、このコードを試しました:

(ViewController.m ファイル):

[user setName:[returned objectAtIndex:2]];

再び同じエラー。

両方が同じ入力を期待している場合、同じ入力がある場合に失敗し、別の場合に成功するのはなぜですか?

ありがとう。

編集:

アプリのこの部分は Web ビューと対話しないため、このエラーは奇妙です。この返された配列は、Web ページから収集された文字列から解析されます。

(ViewController.m ファイル):

NSString *string = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://url_goes_here.com" encoding:NSUTF8StringEncoding error:&error];
NSArray *returned = [returned componentsSeparatedByString:@"#"];

ただし、unid もこの配列から問題なく解析されます。

4

1 に答える 1

3

キーワードは@dynmaic、アクセサーを自分で提供することを意味します。コンパイラにアクセサを作成させたい場合は、@dynamic name宣言を削除するだけです。(@synthesizeがデフォルトになったため、明示的に使用する必要はありません。)それ以外の場合は、、、、およびメソッドを自分で作成する必要があります-name-setName:-unid-setUnid:

実際には、コアデータに NSManagedObject サブクラスを使用して xcode によってセットアップされたクラスです。

これは重要な詳細です。マネージド オブジェクトの場合、Core Data がアクセサーを提供します。必要なのは、@dynamicアクセサー自体を生成しないことをコンパイラに知らせるプロパティ宣言だけです。

このエラーが Web ビューのデリゲート メソッドから発生している理由について、少し混乱しています。Core Data クラスが Web ビューとどのように相互作用しているかについて、もう少し説明していただけると助かります。

これが unid では機能するのに、名前では機能しないのはなぜですか

発生しているエラーは実行時エラーです。例外がスローされています。nameアクセサーは単に最初に使用されるものである可能性があります。unidそのプロパティが最初に設定された場合、同じことが起こる可能性があります。

アプリのこの部分は Web ビューと対話しないため、このエラーは奇妙です。

もう一つの重要な手がかり。この時点で、ポインタが間違っているように思えます。あなたが-setName:思っているものではないオブジェクトに送信しています。この場合、それは Web ビュー デリゲートであることが判明しました。これを追跡するために、NSZombies をオンにしてみてください。

于 2013-07-09T23:30:56.713 に答える