iOS 工程中的逆向传值的方法

在项目内,我们通常需要处理界面之间的数据传递,主要的处理方式有一下几种:

1. 属性传值;
2. 方法参数传值;
3. delegate传值;
4. block回调方法传值;
5. notification,发送通知传递数据信息;
6. 单例修改数据传值;
7. 全局属性传值;
8. NSUserDeaults 传值,属于单例传值的一种;

以上几种方法处理逆向传值,都是OK的。

在修改一个项目中,H领导说想要实现不确定的方法来传值,而不是像代理和block那样,必须实现既定的方法。他写了一套方法,给后面的VC添加target和selector,后面的方法去按照给到的selector去响应。正好,API内包括一个NSInvocation,可以设置target,selector,argument,我们可以按照这个来拿。

在响应的事件后,可以获取NSInvocation的参数,利用参数,然后响应消息。

处理方法有一下几种:

  1. performSelector,注意此方法最多可以传递两个参数;
  2. 可以objc运行时的方法objc_msgSend来转发消息;
  3. 利用NSInvocation的信息去invoke这个方法。

第一种方法,在主线程运行,只能传递一个参数;
第二种方法,在运行时会提示,Too many arguments to function call,expected 0,have 3,需做修改:

Build Setting–> Apple LLVM 7.0 - Preprocessing–> Enable Strict Checking of objc_msgSend Calls 改为 NO.

但是不晓得为啥,我用了第二种第三种方法传递带了两个参数的selector,没执行好。