performSelector: 传递多个参数

在 Objective-C 中,方法的调用方式通常由中括号括起来:

1
[obj methodWithArg1:xxx arg2:xxx]

但有些场景下,我们需要用 performSelector 的方式调用一个对象的方法,例如:

1
[obj performSelector:@selector(methodWithArg1:arg2:) withObject:xxx withObject:xxx]

不过,performSelector: 方法最多只能传递 2 个参数,对于 2 个以上的参数,就没法用它来调用了。

但我们可以用 NSInvocation 调用的方式来扩展 performSelector: 方法,使之能够支持传递不定个参数,具体如图 1 所示,

其中 [EndMark end] 是一个单例,作为参数传递个数结束的标识,其定义如图 2,而不用 nil 作为结束标识,这样可以使该方法支持接收 nil 作为参数值。

接下来,我们就可以使用 performSelector: 方法传递多个参数了。

此外,我们也可以使用 objc_msgSend 函数实现给一个方法传递多个参数,如图 3 所示。

参考链接:不一样的方式实现 performSelector 接收多个参数