2009-05-20 176 views
3

我想要調用具有通常NSError的方法的選擇**論點:需要/想傳遞一個NSError **作爲參數傳遞給performSelector

-(int) getItemsSince:(NSDate *)when dataSelector:(SEL)getDataSelector error:(NSError**)outError { 
    NSArray *data = nil; 
    if([service respondsToSelector:getDataSelector]) { 
     data = [service performSelector:getDataSelector withObject:when withObject:outError]; 
     // etc. 

...,編譯器沒有按」 t like:

warning: passing argument 3 of 'performSelector:withObject:withObject:' from incompatible pointer type 

有沒有什麼辦法可以封裝指針的對象?

回答

14

看看NSInvocation,它可以讓你以更靈活的方式「執行選擇器」。

下面是一些代碼,讓你開始:

if ([service respondsToSelector:getDataSelector]) { 
    NSArray *data; 
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: 
     [service methodSignatureForSelector:getDataSelector]]; 
    [invocation setTarget:delegate]; 
    [invocation setSelector:getDataSelector]; 
    // Note: Indexes 0 and 1 correspond to the implicit arguments self and _cmd, 
    // which are set using setTarget and setSelector. 
    [invocation setArgument:when atIndex:2]; 
    [invocation setArgument:outError atIndex:3]; 
    [invocation invoke]; 
    [invocation getReturnValue:&data]; 
} 
+0

只是爲了正確性 - [自methodSignatureForSelector:getDataSelector]在第三行上面應該是[服務methodSignatureForSelector:getDataSelector] – edoloughlin 2009-05-21 11:22:08

2

我並不積極,但你可能想看看使用NSInvocation而不是-performSelector:withObject:withObject。由於NSInvocation需要void*類型的參數,它可能/應該讓你設置任何你想要的參數。

它將需要比簡單的performSelector:調用多幾行代碼,但它可能比將指針包裝在對象中更方便。

3

NSError **不是一個對象(id),performSelector需要每個withObject參數。你可以去NSInvocation,但是如果這只是你想要使用的單個消息,那看起來很多工作。嘗試定義一箇中間選擇器方法,它將一個對象中包含的NSError **作爲參數,並讓該方法對其執行performSelector(我認爲這可能是您的問題結尾處的意思?)

相關問題