【问题标题】:How to pass a selector with unknown number of arguments to a method in objective C如何将具有未知数量参数的选择器传递给目标C中的方法
【发布时间】:2013-09-09 01:32:21
【问题描述】:

我有几个方法可以做几乎相同的事情,唯一的区别是它们使用的选择器,它被作为参数传递。但是选择器使用不同数量的参数,从 0 到 2,它们也作为参数传递。它看起来像这样(SupportClass 是一个类,我从中调用一个要在随机方法中使用的方法):

-(void) RandomMethod: (SEL) selector {
// some actions here
[SupportClass performSelector:selector];
}

-(void) RandomMethod2: (SEL) selector withObject: object {
// the same actions here
[SupportClass performSelector:selector withObject: object];
}

-(void) RandomMethod2: (SEL) selector withObject1: object1 withObject2: object2 {
// again - the same actions
[SupportClass performSelector:selector withObject1: object1 withObject2:object2];
}

但是由于它们都做同样的事情,我想找到一个更通用的解决方案,可以将它压缩成一个方法,这也可以让我将它用于具有更多参数的选择器(我很可能不会需要,但我仍然认为它看起来不错)。有谁知道如何做到这一点并愿意告诉我吗?

【问题讨论】:

    标签: objective-c methods selector


    【解决方案1】:

    不是传递选择器+参数,而是传递代码块。您的代码似乎是完成块的完美示例。

    例子:

    - (void)someMethodWithCompletionBlock:(void(^)())completionBlock {
       //do something
       completionBlock();
    }
    
    [myObject someMethodWithCompletionBlock:^{
        [SupportClass performSelector:selector];
    };
    

    【讨论】:

      【解决方案2】:

      块解决方案似乎最好,

      你也可以修改你的方法只接收一个 NSDictionary 作为唯一的参数,然后用这个 NSDictionary 传递你的数据

      • (void)methodA:(NSDictionary *)data;

      • (void)methodB:(NSDictionary *)data;

      【讨论】:

      • 或者NSArray,我更喜欢那个。
      【解决方案3】:

      块是最好的方法。

      另一个通用的解决方案是使用forwardInvocation:。不是实现这些方法,而是在某个代理对象上实现forwardInvocation:,然后调用者在这个代理对象上调用他们想要调用的正常方法(即他们没有分离出选择器等。他们假装这个对象具有这些方法并使用参数调用该方法。)。然后在forwardInvocation:,就可以调用SupportClass上的调用了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2019-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多