__bridge导致EXC_BAD_ACCESS

时间:2013-07-19 16:32:45

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

在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

我需要拨打电话吗?

2 个答案:

答案 0 :(得分: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]];

答案 1 :(得分:1)

  

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

考虑到上述陈述,为什么不创建一个存储访问者返回值的变量?

NSMutableData *someData = [value getMutableData];