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

来源:互联网 发布:跳舞软件 编辑:程序博客网 时间:2024/06/16 01:24

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大订书机卡针了怎么办 做原创的衣服该怎么办 4s店强制上牌怎么办 小孩一读书就哭怎么办 小孩上中班还哭怎么办 14岁初中生厌学怎么办 加拿大签证拒签了怎么办 离婚后不给孩子抚养费怎么办 格力空调出现e1怎么办 联想一键恢复后怎么办 微盘密码忘记了怎么办 乐高零件丢了怎么办 tpu手机壳变黄怎么办 脚被铁钉扎了怎么办 孩子性格内向不善于交际怎么办 3岁宝宝胆小怕人怎么办 焦虑症又复发了怎么办 有强迫思维的人怎么办 微信图片是黑的怎么办 玩cf老是卡屏怎么办 玩cf电脑卡屏怎么办 u盘装系统蓝屏怎么办 三星a8无限重启怎么办 旋转轮胎车翻了怎么办 轮胎卸不下来了怎么办 饥荒生病的虫洞怎么办 不小心点了暗网怎么办 苹果手机id用不了怎么办 电脑病毒杀不掉怎么办 高考信息填错了怎么办 家长不给买手机怎么办 2个月宝宝吃奶少怎么办 铅笔断在肉里怎么办 文明6金币负了怎么办 存了理财急用钱怎么办 银行开户许可证丢了怎么办 hcg值低怎么办怎么补 定期存款纸丢了怎么办 我定期存折丢了怎么办 急用钱又借不到怎么办 模拟人生4变胖了怎么办