NSInvocation返回值,但使用EXC_BAD_ACCESS会使应用程序崩溃

赛利斯德

我有一个数组,我正在迭代并正在寻找一个特定的标志。如果标志值为nil,则我正在调用一个方法,该方法生成一个调用对象并返回调用结果。

我的代码结构如下

for(NSString *key in [taxiPlanes allKeys])
{
        Plane *currentPlane = [taxiPlanes objectForKey:key];

        if(currentPlane.currentAction == nil)
        {
            NSString *selector = [[currentPlane planeTakeoffSequence] firstObject];
            currentPlane.currentAction = selector;

            // Calling for NSInvocation in [self ...]
            NSArray *action = [NSArray arrayWithArray:[self operationFromTakeoffAction:currentPlane.currentAction AtPoint:currentPlane.position]];

        NSLog(@"%@",action);
        }
 }

生成NSInvocation的方法

-(NSArray *) operationFromTakeoffAction:(NSString *) action AtPoint:(CGPoint) flightPoint
{
    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 = [NSArray alloc]init];
    [invocation invoke];
    [invocation getReturnValue:&resultSet];

    return resultSet;
}

在for循环中,没有方法调用NSInvocation([self ....]),循环就可以很好地执行并且不会崩溃。但是,当我介绍调用NSInvocation的方法时,我能够看到用于循环的NSLog打印预期的NSArray结果,但是它崩溃并显示错误消息EXC_BAD_ACCESS。

即使NSInvocation返回正确的结果,我也无法弄清楚为什么它会失败。没有NSInvocation,for循环不会崩溃。

任何的意见都将会有帮助。

谢谢

newacct

我猜您正在使用ARC?

问题出在生产线上[invocation getReturnValue:&resultSet];getReturnValue:只是将返回值的字节复制到给定的内存缓冲区中,而不管类型如何。它不知道也不关心内存管理,如果返回类型是可保留对象指针类型。由于resultSet__strong对象指针类型变量,因此ARC假定保留了已放入该变量的任何值,因此在超出范围时将释放它。在这种情况下是不正确的,因此会崩溃。(此外,您resultSet最初指向的数组将被泄漏,因为会getReturnValue:覆盖该值而不释放它。为什么您甚至首先将该变量指向一个对象,这也超出了我的范围。)

解决方案是,您必须为赋予非保留类型的指针getReturnValue:要么:

NSArray * __unsafe_unretained tempResultSet;
[invocation getReturnValue:&tempResultSet];
NSArray *resultSet = tempResultSet;

要么:

void *tempResultSet;
[invocation getReturnValue:&tempResultSet];
NSArray *resultSet = (__bridge NSArray *)tempResultSet;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

应用程序在CGContext.drawPDFPage上使用EXC_BAD_ACCESS崩溃

来自分类Dev

返回上一个视图时,应用程序崩溃-线程1:EXC_BAD_ACCESS

来自分类Dev

返回上一个视图时,应用程序崩溃-线程1:EXC_BAD_ACCESS

来自分类Dev

尝试获取设备位置时,iOS应用程序崩溃-线程1:EXC_BAD_ACCESS

来自分类Dev

尝试获取设备位置时,iOS应用程序崩溃-线程1:EXC_BAD_ACCESS

来自分类Dev

使用NSInvocation时,arm64上的EXC_BAD_ACCESS崩溃

来自分类Dev

一个简单的测试应用程序中的JMImageCache会因EXC_BAD_ACCESS而崩溃

来自分类Dev

Xcode 7 Beta Swift应用程序在运行时因EXC_BAD_ACCESS错误而崩溃

来自分类Dev

NSInvocation获取导致EXC_BAD_ACCESS的目标

来自分类Dev

MS Access应用程序返回值

来自分类Dev

UITextFieldDelegate崩溃(exc_bad_access)

来自分类Dev

NewRelic因EXC_BAD_ACCESS而崩溃

来自分类Dev

iOS应用因EXC_BAD_ACCESS(代码= 1,地址= 0x0)而崩溃

来自分类Dev

使用Tempdata会使我的应用程序崩溃

来自分类Dev

使用GetProcAddress调用外部函数会使应用程序崩溃

来自分类Dev

无法使用setText()每次都会使应用程序崩溃

来自分类Dev

使用NativeCSS时EXC_BAD_ACCESS

来自分类Dev

使用协议组成的EXC_BAD_ACCESS

来自分类Dev

使用MPMoviePlayerViewController的EXC_BAD_ACCESS

来自分类Dev

CGContextDrawPDFPage在OS X 10.8上使用EXC_BAD_ACCESS随机崩溃

来自分类Dev

NSDictionaryM setObject:forKey:EXC_BAD_ACCESS崩溃

来自分类Dev

Swift:glDrawElements崩溃,代码为EXC_BAD_ACCESS = 1

来自分类Dev

SpriteKit SKEmitterNode targetNode崩溃EXC_BAD_ACCESS

来自分类Dev

键盘通知导致EXC_BAD_ACCESS崩溃

来自分类Dev

ios崩溃EXC_BAD_ACCESS KERN_INVALID_ADDRESS

来自分类Dev

解雇UIViewController时EXC_BAD_ACCESS崩溃

来自分类Dev

崩溃日志EXC_BAD_ACCESS(SIGSEGV)iTunes连接

来自分类Dev

OCMArg checkWithBlock因EXC_BAD_ACCESS而崩溃

来自分类Dev

NSOutlineView EXC_BAD_ACCESS在展开时崩溃

Related 相关文章

  1. 1

    应用程序在CGContext.drawPDFPage上使用EXC_BAD_ACCESS崩溃

  2. 2

    返回上一个视图时,应用程序崩溃-线程1:EXC_BAD_ACCESS

  3. 3

    返回上一个视图时,应用程序崩溃-线程1:EXC_BAD_ACCESS

  4. 4

    尝试获取设备位置时,iOS应用程序崩溃-线程1:EXC_BAD_ACCESS

  5. 5

    尝试获取设备位置时,iOS应用程序崩溃-线程1:EXC_BAD_ACCESS

  6. 6

    使用NSInvocation时,arm64上的EXC_BAD_ACCESS崩溃

  7. 7

    一个简单的测试应用程序中的JMImageCache会因EXC_BAD_ACCESS而崩溃

  8. 8

    Xcode 7 Beta Swift应用程序在运行时因EXC_BAD_ACCESS错误而崩溃

  9. 9

    NSInvocation获取导致EXC_BAD_ACCESS的目标

  10. 10

    MS Access应用程序返回值

  11. 11

    UITextFieldDelegate崩溃(exc_bad_access)

  12. 12

    NewRelic因EXC_BAD_ACCESS而崩溃

  13. 13

    iOS应用因EXC_BAD_ACCESS(代码= 1,地址= 0x0)而崩溃

  14. 14

    使用Tempdata会使我的应用程序崩溃

  15. 15

    使用GetProcAddress调用外部函数会使应用程序崩溃

  16. 16

    无法使用setText()每次都会使应用程序崩溃

  17. 17

    使用NativeCSS时EXC_BAD_ACCESS

  18. 18

    使用协议组成的EXC_BAD_ACCESS

  19. 19

    使用MPMoviePlayerViewController的EXC_BAD_ACCESS

  20. 20

    CGContextDrawPDFPage在OS X 10.8上使用EXC_BAD_ACCESS随机崩溃

  21. 21

    NSDictionaryM setObject:forKey:EXC_BAD_ACCESS崩溃

  22. 22

    Swift:glDrawElements崩溃,代码为EXC_BAD_ACCESS = 1

  23. 23

    SpriteKit SKEmitterNode targetNode崩溃EXC_BAD_ACCESS

  24. 24

    键盘通知导致EXC_BAD_ACCESS崩溃

  25. 25

    ios崩溃EXC_BAD_ACCESS KERN_INVALID_ADDRESS

  26. 26

    解雇UIViewController时EXC_BAD_ACCESS崩溃

  27. 27

    崩溃日志EXC_BAD_ACCESS(SIGSEGV)iTunes连接

  28. 28

    OCMArg checkWithBlock因EXC_BAD_ACCESS而崩溃

  29. 29

    NSOutlineView EXC_BAD_ACCESS在展开时崩溃

热门标签

归档