我正在使用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.cpp
和map-util.h
都来自Google Protobuf Lib
。
我很困惑为什么MFMessageComposeViewController
的初始化与Google Protobuf Lib
有关。
删除lib可以解决问题,但在我的通信引擎中需要它。
我用谷歌搜索,没有找到答案。谢谢,如果有人能引导我走向正确的方向。
我不确定这两个截图是否有帮助:
答案 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 ++。