在某些时候,程序可能需要根据获取的参数来决定调用的方法。

要实现这样的功能,就需要使用到动态运行时方法了。

首先需要定义好接口,以便调用。

然后就是动态调用定义好的方法。

这里有两种方法,

第一种:

// 有参数则需要加上冒号
SEL sel = NSSelectorFromString(@"save:"); MyObject obj = [MyObject new]; [obj performSelector:sel withObject:@{@"":@"one"}];

使用第一种方法,程序会出现警告。

第二种:(使用方法指针调用)

MyObject obj = [MyObject new];

SEL sel = NSSelectorFromString(@"save:");

IMP imp = [obj methodForSelector:sel];

/*
* id 对象
* SEL 对象的方法
* id 方法的参数
*/
void (*func)(id, SEL, id) = (void *)imp; // 或者可以这样写 // ((void (*)(id, SEL, id))[obj methodForSlector:sel])(obj, sel, @{@"1":@"one"}); func(manager, sel, @{@"":@"one"});

另外,id类型的熟练使用非常重要。

NSString *param = @"{\"mm\":\"iosqiao\",\"yhm\":\"123456\"}";
id obj = [NSJSONSerialization
JSONObjectWithData:[param dataUsingEncoding:NSUTF8StringEncoding]
options:
error:nil];
MyObject *manager = [MyObject new];
if (!manager) {
return;
}
SEL sel = NSSelectorFromString(@"saveStorage:");
IMP imp = [manager methodForSelector:sel];
void (*func)(id, SEL, id) = (void *)imp;
func(manager, sel, obj);

iOS动态运行时方法的更多相关文章

  1. 我们说的oc是动态运行时语言是什么意思?

    1.KVC和KVO区别,分别在什么情况下使用?  答:KVC(Key-Value-Coding) KVO(Key-Value-Observing)理解KVC与KVO(键-值-编码与键-值-监看) 当通 ...

  2. ios - runtime运行时应用---交换方法

    runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor 首先创建UIV ...

  3. iOS runtime 运行时( 二 )

    我们在编程过程中,如果使用到了runtime(运行时),我们几乎都是想动态的改变这个类的信息,包括方法,属性,balabala的,并且获得这个类的一些信息,等等,下面我们就来看看怎么通过runtime ...

  4. OBJC运行时方法替换(Method swizzling)

    在上周associated objects一文中,我们开始探索Objective-C运行时的一些黑魔法.本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling.   Me ...

  5. iOS runtime 运行时( - )

    谈到运行时,相对应的就有编译时: 1).运行时-- 直到程序运行时才去确定一个对象的具体信息,并且可以改变这个类的具体信息,包括它的方法,变量等等: 2).编译时-- 是在程序运行之前,编译的时候,就 ...

  6. iOS开发运行时总是显示4s的尺寸

    今天新建了一个工程运行时,总是显示4s的尺寸,上面有一片黑,如下图所示: 解决方法:检查启动图片,没有包含6和6plus的启动图片,添加上启动图片时运行正常:

  7. iOS runtime 运行时( 三 )

    上一篇 聊的是: 在不知道一个对象有什么属性的情况下, 获取对象的所有属性,然后可以改变属性的值, 今天我们谈谈 怎么通过Category(类别)+runtime 给一个类 添加一个新的属性,一般情况 ...

  8. iOS运行时 -- Runtime(摘抄自网络)

    运行时(iOS) 一.什么是运行时(Runtime)? 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼.开发中经常用到的底层技术) 二.运行时的作用? 能获得某个类的所有成员变量 能获得某个 ...

  9. iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

    使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...

随机推荐

  1. android XML格式颜色

    <!--android:background="@color/"-> <?xml version="1.0" encoding="u ...

  2. 各种HelloWorld

    http://blog.csdn.net/whxaing2011/article/details/20736759 ES总结: http://www.cnblogs.com/sunxucool/p/3 ...

  3. VC 窗口出现白屏闪烁的解决办法

    处理一下窗口的WM_ERASEBKGND消息即可. 在messagemap里添加ON_WM_ERASEBKGND() 在窗口头文件里添加 afx_msg BOOL OnEraseBkgnd(CDC* ...

  4. Java中,当表单含有文件上传时,提交数据的如何读取

    http://blog.csdn.net/lian_zhihui1984/article/details/6822201

  5. Mysql 关键字-保留字(转帖)

    2008-02-01 10:51 ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH ...

  6. #include <windows.h>

      1 FindWindowA 2 keybd_event 3 malloc 4 MessageBox 5 MessageBoxA 6 MessageBoxW 7 mouse_event 8 SetC ...

  7. Cocos2D-X2.2.3学习笔记8(处理精灵单击、双击和三连击事件)

    我们依据上一次介绍的触屏事件和事件队列等知识来实现触屏的单击,双击,三连击事件. 下图为我们实现的效果图: 单击精灵跳跃一个高度, 双击精灵跳跃的高度比单击的高 三连击精灵跳跃的跟高 好了,開始动手吧 ...

  8. 服务器:RAID、AHCI、IDE

    RAID 独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地)的方法.通过把数据放在多个硬盘上 ...

  9. java 解析json的问题

    本文转载自http://chriszz.sinaapp.com/?p=392 Json就是Javascript notation,可以替代XML,用做数据交互. Json的两种基本表示形式,可以用自动 ...

  10. JS前端知识模块大全

    公司前端:小胖提供,表示感谢 1. 基础 HTML, CSS, JS 文档 W3CSCHOOL: http://www.w3schools.com/ MDN: https://developer.mo ...