8

メソッドを参照するために使用する必要がある理由を理解するために多くの記事を読みました@selector()が、満足しているとは思いません。たとえば、ボタンのアクションを指定する場合、次のように記述する必要があります。

[btn addTarget:self action:@selector(myMethod)];

なぜ単純ではないのですか?

[btn addTarget:self action:myMethod];

必要性と理由、そしてそれなしで何が起こるかを説明してください。

4

4 に答える 4

8

@selectorキーワードを理解するためにたくさんの記事を読みましたが、その目的はまだよくわかりません。@selectorがある理由をお聞きしたいと思います。

それはすべてC言語の構文解析と関係があります。

[obj performSelector:someRandomSelector]'コンパイラのような式では、それ自体で、someRandomSelectorビットを「someRandomSelector式の評価、#definesの処理、後でリンクするためのシンボルの配置など、何でも展開する」として扱います。その展開によって得られるものはすべてSELになります。 。

したがって、コンパイラを作成する場合、揮発性の可能性のあるセレクタを含む変数としてと、のメソッドの実際の名前と[obj performSelector:action]'の違いを知る方法はありません。actionactionobj

@selector()常に一定のSEL結果に評価される言語への構文上の追加を作成することにより、これを解決します。

歴史的に、Objective-Cは元々Cプリプロセッサの直接の拡張として実装されていました。基本的に、接頭辞が付いているものはすべてObjective-Cismであるという点で、さまざまな@...接頭辞が追加されているため、実装がはるかに簡単になりました。@

于 2012-05-25T16:41:34.480 に答える
1

それは言語デザインの問題です。「これはセレクターです」と言う必要があります。これは、話しているセレクターとその周辺のコードを説明するソースファイル内のテキストを区切るために使用される構文です。これには、何らかの引用符または角かっこが必要です。@selector(...)彼らが使った構文です。

:たとえば、と呼ばれるを含むセレクターがある場合はどうなりますthingWithX:y:z:か?[btn addTarget:self action:thingWithX:y:z:]コロンがコンパイラを混乱させるので、あなたは持っていません。[btn addTarget:self action:@selector(thingWithX:y:z:)]btnaction:のセレクターとそれが参照するセレクターを分離できるようにする必要があります`thingWithX:y:z:

于 2012-05-25T16:26:26.367 に答える
0

セレクターに関するドキュメントは次のとおりです。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html#//apple_ref/doc/uid/TP30001163-CH23-SW1

読んで理解していただけると思います。

于 2012-05-25T16:19:25.337 に答える
0

myMethodがSELECTORのインスタンスである場合、例は機能します

[btn addTarget:self action:myMethod];

文字列には使用できます

[btn addTarget:self action:NSSelectorFromString(@"myMethod")];

ここで説明されていますhttps://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

これは、一般的なactionLinker関数の例です。UIButtonのコールバックをプログラムで設定するにはどうすればよいですか?

- (void)setRunButton:(UIButton *)objectName mySelector:(NSString *)action myControlEvent:(UIControlEvents)controlEvent {

   [objectName addTarget:self action:NSSelectorFromString(action) forControlEvents:controlEvent];

}

myMethodをセレクターのインスタンスとして使用して独自の例を使用する場合は、次のコードがより適切です。

- (void)setRunButton:(UIButton *)objectName mySelector:(SEL)action myControlEvent:(UIControlEvents)controlEvent {

   [objectName addTarget:self action:action forControlEvents:controlEvent];

}
于 2014-06-21T20:03:44.390 に答える