- (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;
}
實現performSelector 傳遞多個參數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.