NSInvocation crash

来源:互联网 发布:天猫与淘宝的盈利方式 编辑:程序博客网 时间:2024/05/21 10:09

在使用NSInvocation的过程中,遇到一个问题。那就是在获取返回结果后,app很快crash。示例如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. NSMethodSignature *methodSignature = [FlightOperations instanceMethodSignatureForSelector:NSSelectorFromString(action)];  
  2.   NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];  
  3.   
  4.   [invocation setTarget:fOps];  
  5.   [invocation setSelector:NSSelectorFromString(action)];  
  6.   [invocation setArgument:&flightPoint atIndex:2];  
  7.   
  8.   NSArray *resultSet;  
  9.   [invocation invoke];  
  10.   [invocation getReturnValue:&resultSet];  
  11.   
  12.   return resultSet;  

在设置Enable Zombies后发现,是由于系统多次释放NSArray * resultSet造成的非法内存访问。

原因是在arc模式下,getReturnValue:仅仅是从invocation的返回值拷贝到指定的内存地址,如果返回值是一个NSObject对象的话,是没有处理起内存管理的。而我们在定义resultSet时使用的是__strong类型的指针对象,arc就会假设该内存块已被retain(实际没有),当resultSet出了定义域释放时,导致该crash。假如在定义之前有赋值的话,还会造成内存泄露的问题。

解决办法:

使用一个unretain的对象来获取返回值,或者 用void *指针来保存返回值,然后用__bridge来转化为OC对象。

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. NSArray * __unsafe_unretained tempResultSet;  
  2. [invocation getReturnValue:&tempResultSet];  
  3. NSArray *resultSet = tempResultSet;  

或者
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. void *tempResultSet;  
  2. [invocation getReturnValue:&tempResultSet];  
  3. NSArray *resultSet = (__bridge NSArray *)tempResultSet;
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 嘴上的皮撕破了怎么办 身体皮肤干燥起皮怎么办 把公司数据库弄宕机了怎么办 地铁上临时变站怎么办 大学实践课挂了怎么办 军训的人长得矮怎么办 军训脸被晒黑了怎么办 晚上吃了油炸的怎么办 楼梯又陡又窄怎么办 小孩不认真做作业怎么办 水厂出水水质不达标怎么办 野猪铁夹子夹到怎么办 燃气灶开孔尺寸大了怎么办 苹果电脑视频显示缺少插件怎么办 安装拼多多显示校验失败怎么办 中央庭黑盒被抢怎么办 lab值a值偏高怎么办 橱房管道堵死了怎么办 微信被别的手机同步登录怎么办 计算机机房空调坏了怎么办 被蝎子蛰了怎么办怎么处理? 月嫂走了孩子闹怎么办 转业军人自建房有困难怎么办 转业军人没配偶想异地安置怎么办 转业军人档案和身份证不符怎么办 转业军人个人资被单位遗失怎么办 空军飞行学员停飞后怎么办 2020年不脱贫的农户怎么办 马自达8停产后配件怎么办 钢铁雄心3没将领怎么办 江苏低于二本线怎么办 电工证快过期了怎么办 天正建筑打不开高版本的图纸怎么办 打开天正只显示cad怎么办 天正软件显示过期了怎么办 四岁宝宝经常吐怎么办 穿越火线登陆不上去怎么办 猫猫呕吐带血怎么办 狗又吐又拉稀怎么办 狗狗肠炎拉血怎么办 拉大便有血怎么办呢