performSelector包含2个以上的对象

时间:2010-02-27 08:53:31

标签: objective-c

有没有办法调用[anObject performSelector];超过2个对象?我知道你可以使用一个数组来传递多个参数,但是我想知道是否有一个较低级别的方法来调用一个我已经用更多的2个参数定义的函数,而不使用带有nsarray参数的辅助函数。

3 个答案:

答案 0 :(得分:49)

使用NSInvocation或(2)直接使用objc_msgSend

objc_msgSend(target, @selector(action:::), arg1, arg2, arg3);

(注意:确保所有参数都是id,否则参数可能无法正确发送。)

答案 1 :(得分:14)

您可以像这样扩展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终止的参数数组,但这太过分了。

答案 2 :(得分:0)

当您需要使用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}];

我认为我也可以将其作为替代选项,因为它对我有用。

干杯