【问题标题】:performSelector with more than 2 objects具有超过 2 个对象的 performSelector
【发布时间】:2010-02-27 08:53:30
【问题描述】:

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    要么(1)使用NSInvocation,要么(2)直接使用objc_msgSend

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

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

    【讨论】:

    • 使用 objc_msgSend 时,您需要 #import 按照:stackoverflow.com/questions/4896510/…
    • 关于确保所有 args 都是 id 类型的最后一个注释。你能进一步解释一下吗?或者请提供一些资源?我找不到。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我想我也可以分享这个作为替代选项,因为它对我有用。

      干杯

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 2013-06-18
        • 2020-09-10
        • 1970-01-01
        相关资源
        最近更新 更多