3

次のコード例でセレクターを呼び出せるように、ディスパッチ テーブルを実装しようとしています。

NSInteger i = 2;
[myObject performSelector:selectors[i]];

API のどのメソッドが呼び出されるかに影響するユーザー設定を保存しようとしています。現在、セレクターの文字列名を使用して NSSelectorFromString を使用していますが、それは少し面倒です。ディスパッチ テーブルを使用する場合は、代わりに列挙型を格納できます。

Objective-C でセレクターの配列またはディスパッチ テーブルを作成するにはどうすればよいですか?

編集:

セレクターの配列をプロパティとして設定しようとすると、コンパイラーからエラーが発生します。@property SEL[]コンパイルされません。

編集2:

KosherCocoa APIライブラリを使用しており、保存されたユーザー設定に基づいて、一度に 1 つのメソッドを呼び出したいと考えています。Plistファイルに保存して読み込んでいます。

4

3 に答える 3

3

この型を使用しSELてセレクターを保持できます。単に:

SEL dispatchTable[3] = { @selector(doThis:), 
                         @selector(doThat:), 
                         @selector(doTheOther:) 
                       };

編集するには、代わりにセレクターのNSArray/ NSDictionary/etc をプロパティとして使用します。C 配列を Objective C のプロパティとして使用することは許可されていません。サポートされている型 (ObjC オブジェクト、CF 型、および基本的な C 'Plain Old Data' 型) の 1 つではありません。

以下のコメントで、セレクターを でラップしNSValueて、objc コンテナーで使用できるようにする必要があります (SELは C ポインター型であるため)。

NSMutableArray * dispatchTable2 = [[NSMutableArray alloc] initWithCapacity:3];
SEL selIn = @selector(doThis:);

// Wrap the selector in an NSValue instance
[dispatchTable2 addObject:[NSValue valueWithPointer:selIn]];

// On extracting:
NSValue * valOut = [dispatchTable2 objectAtIndex:0];
SEL selOut = [[dispatchTable2 objectAtIndex:0] pointerValue];
[anObject performSelector:selOut];

これで、テーブルはプロパティまたは ivar として格納された objc コンテナーになり、ポインターを でNSValueラップしてで取得するために使用します。SELvalueWithPointer:SELpointerValue

于 2011-12-19T15:07:41.793 に答える