千家信息网

OC Rumtime中IMP函数调用的示例分析

发表于:2024-10-20 作者:千家信息网编辑
千家信息网最后更新 2024年10月20日,这篇文章主要为大家展示了"OC Rumtime中IMP函数调用的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"OC Rumtime中IMP函数调用
千家信息网最后更新 2024年10月20日OC Rumtime中IMP函数调用的示例分析

这篇文章主要为大家展示了"OC Rumtime中IMP函数调用的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"OC Rumtime中IMP函数调用的示例分析"这篇文章吧。

OC 运行时(runtime),测试了一个函数class_replaceMethod,具体如下:

IMP originalMethod;NSString *CustomUppercaseString(id SELF,SEL _CMD){    NSLog(@"BeginConverting。。。");    NSString *result=originalMethod(SELF,_CMD);    NSLog(@"EndConverting。。。");    return result;}

Implementation中:

- (void)runtimeTest{    originalMethod=[NSString instanceMethodForSelector:@selector(uppercaseString)];    class_replaceMethod([NSString class], @selector(uppercaseString), (IMP)MyUppercaseString,NULL);    NSString *s=@"zhang lei";    NSLog(@"uppercase:%@",[s uppercaseString]);}

运行过程中在下面这行报错:

NSString *result=originalMethod(SELF,_CMD);

①先是提示参数太多,问百度说是IMP本身包含了self和_cmd俩参数,不用再显示传参。去掉参数后继续报错。

②提示在ARC下无法将void *转换为id。关闭ARC后依旧出错,还是无法转换。

当我查看IMP的定义时发现了这个:

/// A pointer to the function of a method implementation. #if !OBJC_OLD_DISPATCH_PROTOTYPEStypedef void (*IMP)(void /* id, SEL, ... */ ); #elsetypedef id (*IMP)(id, SEL, ...); #endif

报错的主要原因是因为IMP取的是if中的定义,返回void *,于是怀疑项目编译设置上设置的不对。继续搜百度找到如下内容:

"使用XCode6.X的小伙伴们要特别注意了,需要先到项目的构建设置里面把Apple LLVM 6.0 - PreprocessingEnable Strict Checking of objc_msgSend Calls 选项设置为NO,否则result = imp(clazz, sel);会报错的!!"

于是按照上面说的进行了设置,运行成功。并且经过调试,发现确实是Enable Strict Checking of objc_msgSend Calls控制着OBJC_OLD_DISPATCH_PROTOTYPES的取值。

以上是"OC Rumtime中IMP函数调用的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

函数 内容 示例 分析 参数 篇文章 运行 项目 学习 帮助 提示 不对 成功 不用 原因 小伙 小伙伴 易懂 更多 条理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云服务器防护ddoscc 软件开发的技术评审 天水网络安全教育平台 网络安全人才平均薪酬 松江区品牌网络技术服务哪家好 pc版我的世界服务器怎么刷东西 桐乡网络安全态势感知平台 找软件开发工作的公司吗 什么叫可视化服务器 广东供应服务器散热风扇供应商 Dell 服务器 清除SEL 湖南收集客户外贸软件开发公司 有意思的我的世界手机版服务器 ibm服务器加装内存条 山西java软件开发价格 重庆懒猪网络技术有限公司 在履行网络安全监督 永恒之塔兄弟服务器切换 多功能存储服务器 密码编码学与网络安全第4版 软件开发效率p50 香港免备案VPS服务器 中国台湾麻将软件开发编程 广东供应服务器散热风扇供应商 压电喷头软件开发厂家 湖北专业服务器机柜虚拟主机 网络安全与防护 课件 社会化网络技术基础 易唐互联网科技有限公司 杭州智慧工会软件开发价位
0