2014-03-04 64 views
0

是否有任何這樣的方法:如何使用選擇器和可變數字參數執行obj-c消息?

- (id)performSelector:(SEL)selector withParameters:(NSArray *)parameters; 

,我可以調用一個OBJ-C消息是這樣的:

// invoke a message with 3 parameters 
[obj performSelector:@selector(evaluate:name:animate:) withParameters:@[@1, @"test", @YES]]; 

// invoke a message with 1 parameter which is an array containing 3 components. 
[NSArray performSelector:@selector(arrayWithArray:) withParameters:@[@[@1, @"test", @YES]]]; 

如果像這樣沒有這樣的方法。我如何使用Obj-C運行時實現這一點?這是不可能的嗎?

+0

@MichaelDautermann在這個問題沒有答案提供了一種方法,它接受一個數組作爲參數。 –

+0

ummm,@BryanChen;我在重複問題*中的答案明確顯示*如何在參數中使用數組。 –

+2

@MichaelDautermann好吧,無論你或我誤解了這個問題。我認爲OP正在詢問一種方法來調用'someMethod:withArg:andArg:andArg:',並在數組中包裝參數。不把數組傳遞給'someMethodTakesArray:' –

回答

2

使用NSInvocation

- (id)performSelector:(SEL)selector withParameters:(NSArray *)parameters 
{ 
    NSMethodSignature *signature = [self methodSignatureForSelector:selector]; 
    NSInvocation  *invocation = [NSInvocation invocationWithMethodSignature:signature]; 

    [invocation setTarget:self];  
    [invocation setSelector:selector];    
    for (int i = 0; i < parameters.count; ++i) 
    { 
     id para = parameters[i]; 
     [invocation setArgument:&para atIndex:2+i]; 
    } 

    [invocation invoke]; 

    id ret; 
    [invocation getReturnValue:&ret]; 
    return ret; 

} 

注:此實現只有當調用的方法需要ObjC對象作爲參數,並返回一個對象的工作。即它不會爲某些需要int或返回double的人工作。

如果您希望它適用於原始類型/結構,則必須檢查NSMethodSignature的參數類型並將對象轉換爲該類型,然後將其傳遞到setArgument:atIndex:

閱讀this question進行更詳細的ansowers

相關問題