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类型,所以没有问题.

时间: 2024-09-06 11:41:48

Xcode中Objc动态调用方法同时避免警告的几个办法的相关文章

JS动态调用方法名示例介绍

 在JS中如何动态调用方法名,想必很多的朋友们都不会吧,下面为大家举例介绍下具体的调用方法 先看看JS的一个函数    JavaScript eval() 函数  定义和用法    eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码.  语法    eval(string)    参数 描述    string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句.    返回值    通过计算 string 得到的值(如果有的话). 

ASP.NET中实现获取调用方法名_实用技巧

本文实例讲述了ASP.NET中实现获取调用方法名的技巧.分享给大家供大家参考.具体实现方法如下: 在写记录日志功能时,需要记录日志调用方所在的模块名.命名空间名.类名以及方法名,想到使用的是反射(涉及到反射请注意性能),但具体是哪一块儿还不了解,于是搜索,整理如下:   需要添加相应的命名空间: 复制代码 代码如下: using System; using System.Diagnostics; using System.Reflection; 如果仅是获取当前方法名,可以使用如下代码: 复制代

smarty中js的调用方法示例_php实例

本文实例讲述了smarty中js的调用方法,分享给大家供大家参考.具体方法分析如下: 一.问题: 有时候,在smarty中,包含js的时候,整个页面就不会显示,而程序员往往在页面中找错误,程序页面,模板页面检查了多次都没有错误,就很郁闷了. 二.解决办法: 把模板页面中的js代码拷贝出来放在新建的js文件中,然后在包含到模板页面里面,如: 复制代码 代码如下: {popup_init src="css/commen.js"} 这样一来,问题就解决了. 希望本文所述对大家的PHP程序设计

.Net——动态调用方法

一,使用InvokeMember 思路:在类型的type的对象上调用InvokeMember方法,传递要在其上调用方法的对象,并指定BindingFlags为InvokeMethod.根据方法签名,可能还需要传递参数. 示例(对普通方法和对静态方法的调用): #region 动态调用方法--使用InvokeMember对一般方法的调用 //Type t = typeof(Calculator); //Calculator c = new Calculator(1, 2); //int resul

Android编程中光线传感器的调用方法详解

本文实例讲述了Android编程中光线传感器的调用方法.分享给大家供大家参考,具体如下: 1.activity如果要使用传感器,就必须实现SensorEventListener接口 2.得到传感器管理对象(sensormanager) 3.使用sensormanager.registerlistener 方法注册指定的传感器 4.在sensoreventlistener 接口中的onsensorchanged和onaccuracychanged方法中完成其他具体工作 public class T

在App Engine 中实现动态调用Section

在APP Engine的运行机制中,默认是从Main Section开始,根据内在的Step排列,从上往下执行的.这种机制能满足我们大多数的工作,但是面对比较复杂的逻辑时,顺序执行就会显得有些苍白无力,这时我们就可以在peoplecode中根据我们的逻辑需求,动态调用section来满足我们的逻辑了. 在我们的App Engine中,有如下几个Section,在Main Section中,添加If Else 逻辑,即如果有银行账户,则用银行打款(call GIRO_CHK Section)的方式

JS动态调用方法名示例介绍_javascript技巧

先看看JS的一个函数 JavaScript eval() 函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句. 返回值 通过计算 string 得到的值(如果有的话). 说明 该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回.因此请不要为 eval() 函

C++中如何动态调用dll杀进程

代码如下: #include <stdio.h> #include <windows.h> typedef int (*lpE_Pro_KillProcessByName)(IN const char* pchar_param_ProName); int main(int argc, char *argv[]) { HINSTANCE hDll; //DLL句柄 lpE_Pro_KillProcessByName KillProcessByName; hDll = LoadLibr

Eclipse中Android公共库的正确建立及调用方法

Eclipse中Android公共库的正确建立及调用方法 引言 之前一直头痛于没有办法在多个程序中共享资源,用作公共类库的方法也是使用的导出jar再导入的办法,现在终于初步搞明白了,可算解脱了~,分享出来. 建立公共库 首先建立公共库的Android项目,名为MyCoreLib: 完成后在左侧包浏览器里右键点选我们新建的这个项目,选择Properties项: 左侧选择Android分类,右侧勾选Is Library选项: 完成后在包资源管理器中删除默认生成的资源,以避免以后被引用时冲突: 打开A