NSInvocation在获取返回值后crash问题
来源:互联网 发布:python 参数 编辑:程序博客网 时间:2024/06/05 20:24
在使用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问题
- 多重背包转换成完全背包和01背包
- HOJ 12822 The Alphabet Sticker
- bzoj1690 [Usaco2007 Dec]奶牛的旅行
- C语言,求数组中第二大值,两种方法.
- hdoj 1061 Rightmost Digit 【数论】
- NSInvocation在获取返回值后crash问题
- 【代码优化】方法签名及参数检查
- 如何快速启动Android模拟器(Android Emulator)
- 【coding看计算机系统s】链接器
- Windows下的服务控制管理器(SCM)
- 如何查看logical和physical standby是否是real time apply
- 编程在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,用空格来分隔单词。
- Deep Learning 系列(2):NN(神经网络)及反向传播算法
- 7.21_java学习_多线程