正在进行中的产品开发是基于苹果的iOS操作系统,自然而然,需要去熟悉和了解如何评估、选择和使用开源项目的代码。
整理内部知识管理平台上留下来的一些开发/集成记录,简单的需要考虑或者侧重以下几个方面:
- C代码开发的项目集成最为方便,源代码加入xcode的项目中,整理出正确的编译指令相关的宏定义,一般被集成项目的编译即可通过。这也是目前我唯一实际成功过的集成方式。也可以使用链接库的方式,但是目前为了简便发布工作,没有研究和使用。
- C++代码开发的项目,理论上可以集成到Objective-C项目中,参考资源: How to wrap a C++ lib in objective-C?。相比C代码集成,项目中特殊化处理的部分复杂的多。使用链接库理论上也是可行的,但仅仅是推测。
- 被集成的项目,最好只使用标准C库中的API,外部依赖越少越好;C语言的使用,越符合ANSI标准越好。
具体到C代码项目的集成:
- 功能较为复杂的被集成项目,为了降低后续开发中使用、维护的成本,“隔离”外部API的调整和变动,一般需要用Objective-C进行OO方式的封装。
- C代码.h头文件中遇见较复杂的struct定义,一般意味着这个结构体为核心数据结构,可以围绕该结构体进行封装,设计相应的Class类型。
- C项目中的“动态特性”,回避不了无类型指针和函数指针的使用,尤其在各种回调/通知函数中。集成过程中的原则是:回调函数中的无类型指针,正好用来传递OO封装后的Class类型的实例;在回调函数内部(或者在申明时即可使用该策略,同样满足编译器检查),将指针还原到实例的Class类型(typecast),然后再调用相应的成员方法。这样就将全局的函数指针与具体的Class实例的成员方法“联系”起来,解决Objective-C定义的Class,成员方法无法获得函数指针的问题。
对于最后一点,一小段代码解释起来会更清楚:
正在进行中的产品开发是基于苹果的iOS操作系统,自然而然,需要去熟悉和了解如何评估、选择和使用开源项目的代码。
整理内部知识管理平台上留下来的一些开发/集成记录,简单的需要考虑或者侧重以下几个方面:
- C代码开发的项目集成最为方便,源代码加入xcode的项目中,整理出正确的编译指令相关的宏定义,一般被集成项目的编译即可通过。这也是目前我唯一实际成功过的集成方式。也可以使用链接库的方式,但是目前为了简便发布工作,没有研究和使用。
- C++代码开发的项目,理论上可以集成到Objective-C项目中,参考资源: How to wrap a C++ lib in objective-C?。相比C代码集成,项目中特殊化处理的部分复杂的多。使用链接库理论上也是可行的,但仅仅是推测。
- 被集成的项目,最好只使用标准C库中的API,外部依赖越少越好;C语言的使用,越符合ANSI标准越好。
具体到C代码项目的集成:
- 功能较为复杂的被集成项目,为了降低后续开发中使用、维护的成本,“隔离”外部API的调整和变动,一般需要用Objective-C进行OO方式的封装。
- C代码.h头文件中遇见较复杂的struct定义,一般意味着这个结构体为核心数据结构,可以围绕该结构体进行封装,设计相应的Class类型。
- C项目中的“动态特性”,回避不了无类型指针和函数指针的使用,尤其在各种回调/通知函数中。集成过程中的原则是:回调函数中的无类型指针,正好用来传递OO封装后的Class类型的实例;在回调函数内部(或者在申明时即可使用该策略,同样满足编译器检查),将指针还原到实例的Class类型(typecast),然后再调用相应的成员方法。这样就将全局的函数指针与具体的Class实例的成员方法“联系”起来,解决Objective-C定义的Class,成员方法无法获得函数指针的问题。
对于最后一点,一小段代码解释起来会更清楚:
//header C source file. typedef int (iksFilterHook)(void *user_data, ikspak *pak); //Objective-C implementation source file. int iks_iq_packet_on_result_filter(JabberClient * jabberClient, ikspak *pak) { NSLog(@"xmpp iq result packet received, id: %s", pak->id); return [jabberClient onXMPPIQPacketArrived:pak]; }