實現performSelector 傳遞多個參數

- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects;

- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects
{
    // 方法簽名(方法的描述)
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];
    if (signature == nil) {
      
        //可以拋出異常也可以不操作。
    }
    
    // NSInvocation : 利用一個NSInvocation對象包裝一次方法調用(方法調用者、方法名、方法參數、方法返回值)
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = selector;
    
    // 設置參數
    NSInteger paramsCount = signature.numberOfArguments - 2; // 除self、_cmd以外的參數個數
    paramsCount = MIN(paramsCount, objects.count);
    for (NSInteger i = 0; i < paramsCount; i++) {
        id object = objects[i];
        if ([object isKindOfClass:[NSNull class]]) continue;
        [invocation setArgument:&object atIndex:i + 2];
    }
    
    // 調用方法
    [invocation invoke];
    
    // 獲取返回值
    id returnValue = nil;
    if (signature.methodReturnLength) { // 有返回值類型,纔去獲得返回值
        [invocation getReturnValue:&returnValue];
    }
    
    return returnValue;
}

發佈了195 篇原創文章 · 獲贊 59 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章