Xcode中Objc动态调用方法同时避免警告的几个办法
我们在Xcode中使用objc写代码的时候往往会碰到动态调用方法的时候.
如果是静态调用这很常见,不会有任何问题:
[self performSelector:@selector(method)];
但如果method是运行时变化的值,则编译器就会发出警告:
简单来说,这是因为编译器在开启ARC后不知道该方法的返回值是什么,该如何处理,是标记为ns_returns_retained还是ns_returns_autoreleased.
在网上搜了一下有几种办法可以解决,首先如果动态调用的方法不返回值,则可以使用afterDelay来消除警告:
[_gameScene.curMapNode performSelector:NSSelectorFromString(selectorName) withObject:nil afterDelay:0];
如果返回值则可以使用宏来消除警告:
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
然后在需要的地方用宏包含:
NSString *newCmd;SuppressPerformSelectorLeakWarning(newCmd = [_gameScene.curMapNode performSelector:NSSelectorFromString(selectorName)];);
最后一种方法是使用IMP调用的方式,以下是我写的调用包装器:
-(id)invokeSelectorNamed:(NSString *)selectorName{SEL selector = NSSelectorFromString(selectorName);IMP imp = [self methodForSelector:selector];id (*func)(id,SEL) = (void*)imp;return func(_gameScene.curMapNode,selector);
}
注意方法返回的是id,意味着可以是任何Objc的对象值,但你必须时刻清楚实际返回值的类型:
NSString *newCmd = [_gameScene.curMapNode invokeSelectorNamed:selectorName];
这里我知道返回的值实际是NSString类型,所以没有问题.
Xcode中Objc动态调用方法同时避免警告的几个办法相关推荐
- 利用.Net中的反射动态调用方法
.Net中的反射功能是极其强大的,本篇先用他来动态调用方法 看如下一个类 Public Class A { public void InvokeMethod(string methodname) { ...
- Java动态调用方法
一直想学如何动态调用方法,今天终于看了一下.. public void function(String str) { / /根据 str的值 调用相应的方法 } public void test() ...
- C# 知识点笔记:IEnumerable的使用,利用反射动态调用方法
IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...
- vue中组件之间调用方法——子组件调用父组件的方法 父组件调用子组件的方法
vue中组件之间调用方法--子组件调用父组件的方法 & 父组件调用子组件的方法 1.vue中子组件调用父组件的方法 1.1.第一种方法是直接在子组件中通过this.$parent.event来 ...
- asp.net中怎样动态调用对象事件的处理方法?
比如有一个gridview,我怎样才能调用它的onpageindexchanging所指定的方法? 前提是我不知道这个方法是什么. 问题补充: 谢谢两位的回答. 上面只是举个例子,我不是想分页,只是只 ...
- struts2中一个表单中提交多个请求(动态调用方法)
在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit按钮,Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执行不同的方法(默认 ...
- 安卓逆向分析中常用动态调试方法总结
安卓逆向之----常用动态调试方法 一. 前言 逆向分析中常用的分析方法有:静态分析.动态调试.HOOK等.动态调试的好处是:1)可以在调试的过程中知道参数或者局部变量的值以及变化过程,2)可以快速履 ...
- java 动态调用方法_Java动态调用方法
public void function(String str) { //根据 str的值 调用相应的方法 } public void test() { //code } 如str的值为test,就调 ...
- 一个实现生产和消费的例子(并且使用了接口和反射技术,动态调用方法)小框架...
主要实现了插件模式,定义好接口,只要实现了接口,可以动态替换方法,也可以动态增加类等. 具体看源代码:/Files/zhugenqiang/ClassLibrary1.rar 转载于:https:// ...
最新文章
- Unparseable date: 2015-8-8
- python中文注释报错
- 如何优化Spring Cloud微服务注册中心架构?
- Oracle10g安装步骤(一)
- 记录本地Hexo博客部署到服务器上
- linux中mpich的运行线程,贝叶斯法构建进化树:MrBayes
- 为什么要设置环境变量,环境变量有什么用?
- 缓存层设计套路(一)
- 项目疑难杂症记录(三):EditText获取不到焦点了?
- 根据录入的计算公式计算_超全的铝材重量计算公式
- Hi3519v101调试 RTC功能
- 产品读书《缔造企鹅:产品经理是这样炼成的》
- uptool u盘量产工具 v2.093
- vue-meta 设置页面 <meta>
- 浏览器LocalStorage和SharedWorker跨标签页通信-连载2
- 用PHP输出对称菱形的简易办法
- Java:Java vs Kotlin–Android应用程序开发的最佳语言?
- Unity接入高德SDK实现定位
- 【洛谷P3818】小A和uim之大逃离 II
- Vue小项目Mock.js的学习
热门文章
- UT2416 wince 6.0 调试LCD35 触摸驱动参考
- Windows Phone 开发工具包7.1公测版新特性
- 《课程的反思与重建--我们需要什么样的课程观》之心得体会
- Something needs to be forgotten.
- 135编辑器 html,135编辑器,微信图文编辑器,微信图文美化编辑器,格式多方便的图文编辑-...
- 费马定理中值定理_数论-欧拉函数、欧拉定理
- java懒汉_java中懒汉式的volatile的问题?
- 使用Pygame制作微信打飞机游戏PC版
- 利用Python绘制萌萌哒的皮卡丘
- 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询