【问题标题】:__bridge causes EXEC_BAD_ACCESS [closed]__bridge 导致 EXC_BAD_ACCESS [关闭]
【发布时间】:2013-07-19 00:54:12
【问题描述】:

ARC 转换期间,Xcode 建议更改

NSMutableData *b = [NSMutableData dataWithBytes:[value getMutableData] 
                                         length:[value length]];

NSMutableData *b = [NSMutableData dataWithBytes:
                       (__bridge const void *)([value getMutableData]) 
                                         length:[value length]];

非 ARC 版本运行良好,但 ARC 版本抛出 EXEC_BAD_ACCESS (code=1)

Value 是具有名为 valueObject 的 NSMutableData 属性的自定义对象。 GetMutableData 是一个返回 valueObject 的访问器。

这是一个展平操作,将b 添加到流中。

有没有我需要调用的版本或免费版本?

【问题讨论】:

  • value是什么对象? [value getMutableData] 返回什么?
  • NSMutableData 没有定义 getMutableData 方法。您是否添加了一个类别,或者您尝试在哪里使用 mutableBytes 方法?
  • NSDataNSMutableData上没有方法叫getMutableData,那么value怎么可能是NSMutableData呢?如果是的话,你为什么要从中创建 另一个 NSMutableData ?这是你的真实代码吗?
  • 当我逐步完成调试过程时,ARC 更改可能是问题的根源,因为代码在 ARC 之前工作。正如我在下面提到的,pre-ARC 在克隆 datawithbytes 中的数据时更加宽容。我改成显式克隆,问题就解决了。

标签: objective-c automatic-ref-counting exc-bad-access


【解决方案1】:

Value 是具有名为 valueObject 的 NSMutableData 属性的自定义对象。 GetMutableData 是一个返回 valueObject 的访问器。

考虑到上面的说法,为什么不直接创建一个变量来存储访问器的返回值呢?

NSMutableData *someData = [value getMutableData];

【讨论】:

    【解决方案2】:

    问题在于您试图将一个可保留对象指针类型桥接到另一个可保留对象指针类型。

    您无需将 getMutableData 强制转换为 void *。你只需要传入一个字节数组。

    这里有一个更好的解释: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#arc-objects-restrictions-conversion

    这明确规定了以下内容:

    例如,Objective-C 对象指针不应转换为 无效*。

    下面是如何使用桥接强制转换的更好解释: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#bridged-casts

    如果我理解正确,您的问题的一些解决方案是 value 有一个返回 NSMutableData 对象的方法。

    NSMutableData *b = [NSMutableData dataWithBytes:[[value getMutableData] bytes] 
                                             length:[value length]];
    

    【讨论】:

    • Simon - 感谢您为我指明正确的方向。在克隆数据方面,非 Arc 似乎要好得多。我向我的对象添加了一个克隆访问器,并且成功了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2016-11-19
    • 2012-10-02
    • 2011-04-14
    • 2017-03-15
    • 2014-09-27
    相关资源
    最近更新 更多