iOS App中奇怪的EXC_BAD_ACCESS

时间:2012-12-28 07:34:53

标签: exc-bad-access protocol-buffers messageui

我正在使用MFMessageComposeViewController在我的视图控制器中发送消息。在导入Google Protobuf Lib之前,所有的事情都有效。但是在导入lib之后,我总是在以下行获得EXC_BAD_ACCESS错误:

MFMessageComposeViewController *messager = [[MFMessageComposeViewController alloc] init];

但是在Debug Navigator中,我总是得到以下堆栈,这导致我bool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddFile中的descriptor_database.cpp方法,然后bool InsertIfNotPresent中的map-util.h方法。 descriptor_database.cppmap-util.h都来自Google Protobuf Lib

Stack

我很困惑为什么MFMessageComposeViewController的初始化与Google Protobuf Lib有关。

删除lib可以解决问题,但在我的通信引擎中需要它。

我用谷歌搜索,没有找到答案。谢谢,如果有人能引导我走向正确的方向。

我不确定这两个截图是否有帮助:

Screenshot 1 Screenshot 2

3 个答案:

答案 0 :(得分:4)

将protobuf库编译器选项“Apple LLVM编译器4.2 - 代码生成\默认隐藏的符号”更改为YES将解决此问题。

答案 1 :(得分:2)

用gcc编译protobuf并使用标志-fvisibility = hidden(不带符号)为我工作 (为arm7编译)

答案 2 :(得分:0)

这也发生在我身上。我的堆栈跟踪不完全相同但相似。

从跟踪中可以看出,调用[MFMessageComposeViewController init]导致加载libprotobuf.dylib。

这是Apple的dylib,因此MFMessageComposeViewController在内部直接或间接依赖于libprotobuf。加载它可能与您的静态版本的protobuf冲突。

我还没弄清楚如何/为什么会这样。

我通过将C ++标准库设置为libc ++解决了这个问题。注意:您还需要使用libc ++构建链接到的所有C ++库。构建它们时,请确保设置CXX=clang++CXXFLAGS='-stdlib=libc++'。

注意:这会强制您定位iOS 5.0+,因为早期版本的iOS上没有libc ++。