【发布时间】:2010-02-27 08:53:30
【问题描述】:
有没有办法调用[anObject performSelector];有超过 2 个对象?我知道你可以使用一个数组来传递多个参数,但我想知道是否有一种较低级别的方法来调用我已经用超过 2 个参数定义的函数,而无需使用带有 nsarray 参数的辅助函数。
【问题讨论】:
标签: objective-c
有没有办法调用[anObject performSelector];有超过 2 个对象?我知道你可以使用一个数组来传递多个参数,但我想知道是否有一种较低级别的方法来调用我已经用超过 2 个参数定义的函数,而无需使用带有 nsarray 参数的辅助函数。
【问题讨论】:
标签: objective-c
要么(1)使用NSInvocation,要么(2)直接使用objc_msgSend。
objc_msgSend(target, @selector(action:::), arg1, arg2, arg3);
(注意:确保所有参数都是id的,否则参数可能无法正确发送。)
【讨论】:
您可以像这样扩展NSObject 类:
- (id) performSelector: (SEL) selector withObject: (id) p1
withObject: (id) p2 withObject: (id) p3
{
NSMethodSignature *sig = [self methodSignatureForSelector:selector];
if (!sig)
return nil;
NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
[invo setTarget:self];
[invo setSelector:selector];
[invo setArgument:&p1 atIndex:2];
[invo setArgument:&p2 atIndex:3];
[invo setArgument:&p3 atIndex:4];
[invo invoke];
if (sig.methodReturnLength) {
id anObject;
[invo getReturnValue:&anObject];
return anObject;
}
return nil;
}
(请参阅 Three20 项目中的 NSObjectAdditions。)然后您甚至可以扩展上述方法以使用 varargs 和以 nil 结尾的参数数组,但这太过分了。
【讨论】:
当您需要使用performSelector 发送多个对象时,另一个选项是(如果这样做很容易)修改您希望调用的方法以获取NSDictionary 对象而不是多个参数,就像您一样将能够在字典中发送任意数量的内容。
例如
我有一个类似的方法,它有 3 个参数,我需要从 performSelector 调用它 -
-(void)getAllDetailsForObjectId:(NSString*)objId segment:(Segment*)segment inContext:(NSManagedObjectContext*)context{
我改变了这个方法来使用字典来存储参数
-(void)getAllDetailsForObject:(NSDictionary*)details{
因此我能够轻松调用该方法
[self performSelector:@selector(getAllDetailsForObject:) withObject:@{Your info stored within a dictionary}];
我想我也可以分享这个作为替代选项,因为它对我有用。
干杯
【讨论】: