C++ 将数据写入套接字之类的东西。。。 -(NSData*)getDataForZombie:(kotancode::ZombieSighting*)僵尸{ std::string ps=zombie->SerializeAsString(); 返回[NSData dataWithBytes:ps.c_str()长度:ps.size()]; } //从NSData对象反序列化僵尸。 -(kotancode::ZombieSighting*)getZombieFromData:(NSData*)数据{ int len=[数据长度]; 生炭[精]; kotancode::ZombieSighting*zombie=新kotancode::ZombieSighting; [data getBytes:原始长度:len]; 僵尸->ParseFromArray(原始,len); 返回僵尸; } @结束

C++ 将数据写入套接字之类的东西。。。 -(NSData*)getDataForZombie:(kotancode::ZombieSighting*)僵尸{ std::string ps=zombie->SerializeAsString(); 返回[NSData dataWithBytes:ps.c_str()长度:ps.size()]; } //从NSData对象反序列化僵尸。 -(kotancode::ZombieSighting*)getZombieFromData:(NSData*)数据{ int len=[数据长度]; 生炭[精]; kotancode::ZombieSighting*zombie=新kotancode::ZombieSighting; [data getBytes:原始长度:len]; 僵尸->ParseFromArray(原始,len); 返回僵尸; } @结束,c++,ios,protocol-buffers,C++,Ios,Protocol Buffers,编辑:我正在使用Xcode 4.5。即使在我完成了所有步骤之后,我仍然会遇到一个链接器错误 未找到架构i386的符号 由于这个原因,我无法在模拟器上运行代码。但它在实际设备上工作根据实际问题,我想我的评论值得作为答案发表: 我使用的是由 它支持现成的重复字段,但为了使用ObjC快速枚举,您需要将PBArray类型(基本上是类型化的c缓冲区)转换为它所表示的NSObjects数组—对象的NSNumber或protobuf消息。您可以在中看到更新的快速枚举代码的示例:。您还可以在PBArray上添加

编辑:我正在使用Xcode 4.5。即使在我完成了所有步骤之后,我仍然会遇到一个链接器错误

未找到架构i386的符号


由于这个原因,我无法在模拟器上运行代码。但它在实际设备上工作

根据实际问题,我想我的评论值得作为答案发表:

我使用的是由

它支持现成的重复字段,但为了使用ObjC快速枚举,您需要将PBArray类型(基本上是类型化的c缓冲区)转换为它所表示的NSObjects数组—对象的NSNumber或protobuf消息。您可以在中看到更新的快速枚举代码的示例:。您还可以在PBArray上添加一个名为ToObject的类别

我只是用
-fno objc arc
标记生成的代码,但是您可以从中获得arc和2.5支持

这些说明对于设置来说非常好,但是如果人们想要关于我使用的类别的更明确的说明,我如何构建protobuf objc插件,如何获得对类前缀的支持(例如,IXMyProtoMessage而不是MyProtoMessage),或者我如何生成代码,请让我知道,我将尝试留出时间来写一篇文章。我使用它来处理>50个具有许多跨项目依赖关系的proto文件


该库的一个弱点是,它没有在生成的代码中包含典型的Protobuf反射api,因此,要想将消息转换为NSDictionary,就必须在objC运行时执行一些骇客操作(代码没有遵循典型的KV遵从性)或者从具有反射api的protos编写一个自定义代码生成器(我是用python+jinja2实现的)。或者-更好的方法是,将反射API添加到代码生成器中,难度与之类似;)

您可以使用Cocoapods将对Google协议缓冲区的支持添加到Xcode 5项目中,方法是在pod文件中添加以下行

pod 'GoogleProtobuf', '~> 2.5.0'

将将原BuffF代码的C++版本放入项目的POD中。它还将在项目的

Pods/GoogleProtobuf/bin/protoc
文件夹中添加
protoc
编译器

您可以在项目中创建自定义生成规则,自动将
.proto
文件转换为
.ph.{h,cc}
文件。我是这样做的:

设置生成规则以“使用自定义脚本处理名称匹配为:*.proto的源文件”。脚本应包括以下内容:

cd ${INPUT_FILE_DIR}
${SRCROOT}/Pods/GoogleProtobuf/bin/protoc --proto_path=${INPUT_FILE_DIR} ${INPUT_FILE_PATH} --cpp_out=${INPUT_FILE_DIR}/cpp
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.h
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.cc
将输出文件设置为包括以下内容:

cd ${INPUT_FILE_DIR}
${SRCROOT}/Pods/GoogleProtobuf/bin/protoc --proto_path=${INPUT_FILE_DIR} ${INPUT_FILE_PATH} --cpp_out=${INPUT_FILE_DIR}/cpp
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.h
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.cc

<> < <代码> > Projuts<代码>文件,现在在项目中自动转换为C++,然后编译为构建的一部分。

当你说“把谷歌头目录添加到你的附加目录中”时,这意味着什么?是否将其添加到标头搜索路径?在XCode中,这意味着将其添加到标头搜索路径,是的。不同的编译器IDE将有不同的标签。祝您一切顺利。如果有人遵循此操作并发现无法找到的问题,请删除
config.h
中的“tr1”。此外,如果您未能编译
message.cc
,请在
message.cc
文件中添加
include
。按照此处提供的一般说明,我构建了一个CoCoPapod,它直接从Google tar.gz文件安装Google Protobuf v2.5.0。它适用于Xcode 5,面向iOS 7。它还包括一个针对Mac OS的protoc编译器的构建,这样就可以在项目中添加Protobuf支持,而无需额外的麻烦。podspec在Cocoapods Specs主要回购协议中。只要“搜索舱”就可以找到了。好的,我找到了。C++语言必须设置为C++ 11和标准库,以LIbc++为基础。这是一个很好的帖子,但是我很好奇为什么人们不想使用PoyYAH端口(基于元语法)?它给了你Objc对象,所以你的视图代码不用担心有不同符号的C++对象和手动空闲内存(如果使用ARC)?是protobuf版本的东西吗?你需要C++提供的反射API吗?我在多个项目中使用booyah端口,到目前为止效果很好……我在编译带有“重复”变量的protos时遇到了问题。@Ted请发布您正在使用的库的链接。我还遇到了“重复”问题变量bug,例如@ TusharKoul,这意味着我必须使用这个C++代码。@ AlBeebe,您是否尝试编译TED发布的PoyayaRePo中的代码?参考另一个可能执行本地构建的解决方案。您可以分享您的扩展,关于如何将代码> PBArray < /C> >转换为<代码> NSArray < /代码>?
pod 'GoogleProtobuf', '~> 2.5.0'
cd ${INPUT_FILE_DIR}
${SRCROOT}/Pods/GoogleProtobuf/bin/protoc --proto_path=${INPUT_FILE_DIR} ${INPUT_FILE_PATH} --cpp_out=${INPUT_FILE_DIR}/cpp
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.h
$(INPUT_FILE_DIR)/cpp/$(INPUT_FILE_BASE).pb.cc