2009-05-29 5 views
4

セレクタをNSMutableArrayに追加したいと思います。しかし、それらは不透明な型でオブジェクトがないので、うまくいかないでしょうか?私が使用できるラッパーオブジェクトはありますか?または私は自分自身を作成する必要がありますか?SELのラッパーオブジェクトはありますか?

答えて

5

あなたはアレイセレクタのNSStringの名前を格納し、格納された文字列からセレクタを生成する

SEL mySelector = NSSelectorFromString([selectorArray objectAtIndex:0]); 

を使用することができます。

また、あなたはこのNSInvocationオブジェクトは、配列に格納され、後に起動することができます

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:mySelector]]; 

[invocation setTarget:self]; 
[invocation setSelector:mySelector]; 
[invocation setArgument:&arg atIndex:2]; 
[invocation retainArguments]; 

のようなものを使用してNSInvocationとしてセレクタをパッケージ化することができます。

+0

興味深い:

これらはNSValueオブジェクトにセレクタを置くのすべての有効な方法です! –

9

あなたは次のようにNSValueインスタンスでそれをラップすることができます:

SEL mySelector = @selector(performSomething:); 
NSValue *value = [NSValue value:&mySelector withObjCType:@encode(SEL)]; 

をして、あなたのNSMutableArrayインスタンスに値を追加します。

2

NSValue valueWithPointer/pointerValueも同様に機能します。

NSStringFromSelectorアプローチを使用して、配列をシリアル化できない(つまり、ファイルに書き込むことができない)ことがわかっているだけです。私はNSInvocationを使ったことがない - - おかげ

id selWrapper1 = [NSValue valueWithPointer:_cmd]; 
    id selWrapper2 = [NSValue valueWithPointer:@selector(viewDidLoad)]; 
    id selWrapper3 = [NSValue valueWithPointer:@selector(setObject:forKey:)]; 
    NSString *myProperty = @"frame"; 
    NSString *propertySetter = [NSString stringWithFormat:@"set%@%@:", 
           [[myProperty substringToIndex:1]uppercaseString], 
           [myProperty substringFromIndex:1]]; 

    id selWrapper4 = [NSValue valueWithPointer:NSSelectorFromString(propertySetter)]; 

    NSArray *array = [NSArray arrayWithObjects: 
         selWrapper1, 
         selWrapper2, 
         selWrapper3, 
         selWrapper4, nil]; 

    SEL theCmd1 = [[array objectAtIndex:0] pointerValue]; 
    SEL theCmd2 = [[array objectAtIndex:1] pointerValue]; 
    SEL theCmd3 = [[array objectAtIndex:2] pointerValue]; 
    SEL theCmd4 = [[array objectAtIndex:3] pointerValue]; 
関連する問題