如何将具有未知数量参数的选择器传递给目标C中的方法

时间:2013-09-05 09:24:38

标签: objective-c methods selector

我有几个方法几乎完全相同,唯一的区别是它们使用的选择器,它作为参数传递。但是选择器使用不同数量的参数,从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];
}

但是既然他们都这样做了,我想找到一个更通用的解决方案,它可以将它压缩成一个方法,这也使我能够将它用于具有更多参数的选择器(我很可能不会需要,但我想它看起来还不错)。有谁知道如何做到这一点,并会很友好地告诉我?

3 个答案:

答案 0 :(得分:2)

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

示例:

- (void)someMethodWithCompletionBlock:(void(^)())completionBlock {
   //do something
   completionBlock();
}

[myObject someMethodWithCompletionBlock:^{
    [SupportClass performSelector:selector];
};

答案 1 :(得分:0)

阻止解决方案似乎最好,

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

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

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

答案 2 :(得分:0)

阻止是最好的方法。

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