NSInvocation在获取返回值后crash问题
来源:互联网 发布:vmware player mac os 编辑:程序博客网 时间:2024/06/04 23:22
转载自:http://blog.csdn.net/zengconggen/article/details/38024625
在使用NSInvocation的过程中,遇到一个问题。那就是在获取返回结果后,app很快crash。示例如下:
- NSMethodSignature *methodSignature = [FlightOperations instanceMethodSignatureForSelector:NSSelectorFromString(action)];
- NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
- [invocation setTarget:fOps];
- [invocation setSelector:NSSelectorFromString(action)];
- [invocation setArgument:&flightPoint atIndex:2];
- NSArray *resultSet;
- [invocation invoke];
- [invocation getReturnValue:&resultSet];
- return resultSet;
在设置Enable Zombies后发现,是由于系统多次释放NSArray * resultSet造成的非法内存访问。
原因是在arc模式下,getReturnValue:仅仅是从invocation的返回值拷贝到制定的内存地址,如果返回值是一个NSObject对象的话,是没有处理起内存管理的。而我们在定义resultSet时使用的是__strong类型的指针对象,arc就会假设该内存块已被retain(实际没有),当resultSet出了定义域释放时,导致该crash。加入在定义之前有赋值的话,还会造成内存泄露的问题。
解决办法:
使用一个unretain的对象来获取返回值,或者 用void *指针来保存返回值,然后用__bridge来转化为OC对象。
- NSArray * __unsafe_unretained tempResultSet;
- [invocation getReturnValue:&tempResultSet];
- NSArray *resultSet = tempResultSet;
或者
- void *tempResultSet;
- [invocation getReturnValue:&tempResultSet];
- NSArray *resultSet = (__bridge NSArray *)tempResultSet; (我用的是这种方法)
0 0
- NSInvocation在获取返回值后crash问题
- NSInvocation在获取返回值后crash问题
- NSInvocation在获取返回值后crash问题
- NSInvocation在获取返回值后crash问题
- NSInvocation crash
- DragonBones 在使用 CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames(); 后crash的问题
- cocos2dx在暂停某些元素后导致crash问题
- 返回object问题,在window.open后
- removeSpriteFrames()后crash的问题
- 关于C++调用C#封装的dll后,获取C#中string返回值的问题
- Ajax请求成功后,获取success中的返回的问题
- Core Data结构修改后,在AppStore中更新升级crash的问题.
- Core Data结构修改,升级,迁移,后,在AppStore中更新升级crash的问题.
- NSInvocation selector 参数问题
- CCUserDefault crash后数据不保存问题
- ios设置delegate后crash的问题
- 在存储过程中执行动态sql后的返回值的问题
- ListView自定义后,在onItemClick中getChildAt返回null问题
- poj 2359 约瑟夫环数学问题
- vb.net 控件使用外部字体自动选择
- hdu 2190 悼念512汶川大地震遇难同胞——重建希望小学
- document获取节点
- 基于贪心算法的几类区间覆盖问题
- NSInvocation在获取返回值后crash问题
- 测试
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- 题目1032 ZOJ
- Linux系统简介
- lightoj -1006 水题
- HTTP协议 (二) 基本认证
- UVA - 519 Puzzle (II)
- ubuntu搭建tftp传文件