在 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 所示。