我有这种情况:
a)为iOS创建的静态库,使用从protobuf消息文件生成的协议缓冲区类。此静态库用于Application(A)
b)protobuff消息有一堆setter和allocated_setters,所有c ++代码
c)应用程序(C),它依赖于创建静态库的项目。
发生了什么:
当Application(A)中包含静态库并运行App时,我在协议缓冲类的基本setter之一中获得了EXC_BAD_ACCESS。
inline void ABCD::set_companyname32chars(const char* value) {
set_has_companyname32chars();
if (companyname32chars_ == &::google::protobuf::internal::kEmptyString) {
companyname32chars_ = new ::std::string;
}
companyname32chars_->assign(value);
}
最后一行
companyname32chars_->assign(value)
生成EXC_BAD_ACCESS。 我使用这个setter的方式是这样的:
ABCD* abcd = new ABCD();
abcd->set_companyname32chars("Andes");
踢球者是,相同的代码在同一部手机上的应用程序C上运行良好。
使用以下切片创建静态库:armv7,armv7s和arm64。
我正在尝试的iPhone是iPhone 5和iOS 8.2(测试版)
然而,EXC_BAD_ACCESS与内存有关,
a)为什么当相同的代码作为项目依赖项而不是静态库包含时,它们可以与类似的应用程序一起使用。 b)有没有办法调试和完成正在发生的事情?我试过启用Zombies,但没有用。
答案 0 :(得分:0)
看起来:: google :: protobuf :: internal :: kEmptyString是一个存在于静态库和应用程序中的变量,具有不同的值。因此,如果您的companyname32chars等于其中一个而不是另一个的地址,则无法识别。如果变量在静态库代码中设置,但在应用程序代码中通过内联检查,则总会发生这种情况。