我们在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动态调用方法同时避免警告的几个办法相关推荐

  1. 利用.Net中的反射动态调用方法

    .Net中的反射功能是极其强大的,本篇先用他来动态调用方法 看如下一个类 Public Class A { public void InvokeMethod(string methodname) { ...

  2. Java动态调用方法

    一直想学如何动态调用方法,今天终于看了一下.. public void function(String str) { / /根据 str的值 调用相应的方法 } public void test() ...

  3. C# 知识点笔记:IEnumerable的使用,利用反射动态调用方法

    IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...

  4. vue中组件之间调用方法——子组件调用父组件的方法 父组件调用子组件的方法

    vue中组件之间调用方法--子组件调用父组件的方法 & 父组件调用子组件的方法 1.vue中子组件调用父组件的方法 1.1.第一种方法是直接在子组件中通过this.$parent.event来 ...

  5. asp.net中怎样动态调用对象事件的处理方法?

    比如有一个gridview,我怎样才能调用它的onpageindexchanging所指定的方法? 前提是我不知道这个方法是什么. 问题补充: 谢谢两位的回答. 上面只是举个例子,我不是想分页,只是只 ...

  6. struts2中一个表单中提交多个请求(动态调用方法)

    在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit按钮,Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执行不同的方法(默认 ...

  7. 安卓逆向分析中常用动态调试方法总结

    安卓逆向之----常用动态调试方法 一. 前言 逆向分析中常用的分析方法有:静态分析.动态调试.HOOK等.动态调试的好处是:1)可以在调试的过程中知道参数或者局部变量的值以及变化过程,2)可以快速履 ...

  8. java 动态调用方法_Java动态调用方法

    public void function(String str) { //根据 str的值 调用相应的方法 } public void test() { //code } 如str的值为test,就调 ...

  9. 一个实现生产和消费的例子(并且使用了接口和反射技术,动态调用方法)小框架...

    主要实现了插件模式,定义好接口,只要实现了接口,可以动态替换方法,也可以动态增加类等. 具体看源代码:/Files/zhugenqiang/ClassLibrary1.rar 转载于:https:// ...

最新文章

  1. Unparseable date: 2015-8-8
  2. python中文注释报错
  3. 如何优化Spring Cloud微服务注册中心架构?
  4. Oracle10g安装步骤(一)
  5. 记录本地Hexo博客部署到服务器上
  6. linux中mpich的运行线程,贝叶斯法构建进化树:MrBayes
  7. 为什么要设置环境变量,环境变量有什么用?
  8. 缓存层设计套路(一)
  9. 项目疑难杂症记录(三):EditText获取不到焦点了?
  10. 根据录入的计算公式计算_超全的铝材重量计算公式
  11. Hi3519v101调试 RTC功能
  12. 产品读书《缔造企鹅:产品经理是这样炼成的》
  13. uptool u盘量产工具 v2.093
  14. vue-meta 设置页面 <meta>
  15. 浏览器LocalStorage和SharedWorker跨标签页通信-连载2
  16. 用PHP输出对称菱形的简易办法
  17. Java:Java vs Kotlin–Android应用程序开发的最佳语言?
  18. Unity接入高德SDK实现定位
  19. 【洛谷P3818】小A和uim之大逃离 II
  20. Vue小项目Mock.js的学习

热门文章

  1. UT2416 wince 6.0 调试LCD35 触摸驱动参考
  2. Windows Phone 开发工具包7.1公测版新特性
  3. 《课程的反思与重建--我们需要什么样的课程观》之心得体会
  4. Something needs to be forgotten.
  5. 135编辑器 html,135编辑器,微信图文编辑器,微信图文美化编辑器,格式多方便的图文编辑-...
  6. 费马定理中值定理_数论-欧拉函数、欧拉定理
  7. java懒汉_java中懒汉式的volatile的问题?
  8. 使用Pygame制作微信打飞机游戏PC版
  9. 利用Python绘制萌萌哒的皮卡丘
  10. 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询