拒绝 PerformSelector,64位下方法调用标准写法

2017-01-11 15:25:01来源:http://www.jianshu.com/p/33c9893237e2作者:Super_Bang人点击

第七城市

不使用 PerformSelector 的原因:



1: 内存泄漏


2: 参数个数受限


3: 参数类型受限



以上三个原因,基本决定了 PerformSelector 不足以在要求较高的开发环境下使用。


我们今天要去了解的,64位下方法调用的标准写法,可以完美的解决这个问题。


先来看下面的这行代码:


((void(*)(id, SEL, id, int, BOOL))objc_msgSend)(object, sel_registerName("A:B:C:"), value_1, value_2, value_3);

我们来逐一分析。


上面这行代码主要分为三个部分,分别是 void, (id, SEL, id, int, BOOL)(Object_1, sel_registerName("A:B:C:"), value_1, value_2, value_3)



第一个部分,指示的是函数方法的返回值,参数对应返回值的类型。例如,void 对应的是没有返回值,id 则是 id 类型的返回值,而 void 则是对应任意类型的返回值,值得注意的是,这个返回值类型如果使用了 void *, 可能导致返回值无法正常解析。



第二个部分,指示的是 target,SEL 和函数参数的类型。



第三部分,指示的是对应 target,SEL 和函数参数的值。



Tip: 当 object 是类的时候,调用的是静态函数,而当 object 是实例对象的时候,调用的是实例函数。






第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台