1

私はObjective Cが初めてだと言って始めましょう。

エラーが発生しています atusMenuApp[24288:303] -[__NSCFConstantString createListItem]: unrecognized selector sent to instance 0x100002450

これが私のコードです:

selector = [NSMutableArray arrayWithObjects: @"nvda", @"aapl", @"goog", nil];
[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self];

- (void)createListItem:(NSString *)title {
//do some stuff
}

今、私は周りを見回し:ました. makeObjectsPerformSelectorたぶん、私が見つけたドキュメントを調べた後、の使用をよく理解していません:

Sends to each object in the array the message identified by a given selector, starting with the first object and continuing through the array to the last object.

どんな助けでも素晴らしいでしょう、ありがとう!

4

3 に答える 3

4

[ドキュメンテーションを読んだ場合(または、メソッドの名前がこのように付けられた理由について少し考えた場合)、またはエラー メッセージを理解しようと努力した場合のみ...]

makeObjectsPerformSelector:withObject:メソッドはNSArray、それが示唆することを行います。配列のオブジェクトに、オプションの引数を持つことができるセレクターを実行させます。そう

[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self];

配列内のすべてのオブジェクトcreateListItem:にメッセージを送信し、その引数として渡します。オブジェクトを渡すときにセレクターを実行しません。つまり、あなたが持っているものはNSStringselectorselfself

for (NSString *obj in selector) {
    [obj createListItem:self];
}

明らかに、これの代わりに、次のものが必要です。

for (NSString *obj in selector) {
    [self createListItem:obj];
}

これには、その厄介な方法さえ必要ありません。素敵な高速列挙forループがそれを行います。

于 2012-12-31T00:05:34.353 に答える
1

まず、s の配列を作成しますNSString。次に、すべてのメッセージを送信しますcreateListItem。それはすべてうまくいきますが、;NSStringと呼ばれるメソッドはありません。createListItem呼び出されるインスタンス メソッドを定義したからといってcreateListItem、すべてのクラスのすべてのインスタンスがそれを使用できるわけではありません。実装ファイルに定義があるクラスのみがメッセージを処理できます。たとえば、インスタンスのリストを作成して、の実装と呼ばれる別のクラスCarでメソッドを定義し、 のインスタンスを呼び出すことができると期待することはできません。しか使えません。Objective-C に関する優れた本を読んで、クラス、インスタンス、およびインスタンス メソッドについてさらに理解を深めることをお勧めします。flyHelicopterflyCarHelicopter

于 2012-12-31T00:05:25.950 に答える
1

あなたは方法を誤解しています。

のすべてのオブジェクトに対して、createListItem:引数を指定してメソッドを呼び出します。selfNSArray

したがって、結果の呼び出しは次のようになります。

[@"nvda" createListItem:self];
...

明らかにそのメソッドは a には存在せずNSString、例外が発生します。

self配列内のすべてのオブジェクトにメソッドを適用する必要がある場合は、単純にループします。

于 2012-12-31T00:05:52.873 に答える