C++、Objective-C 混合编程

在XCODE中想使用C++代码,你须要把文件的扩展名从.m改成.mm。这样才会启动g++编译器。

我们来看个測试代码:

[java]view plaincopy

  1. class TestC {
  2. private:
  3. NSString *str_;//C++类能够使用OC对象作为成员变量
  4. public:
  5. TestC() {
  6. str_ = @"hi mc0066.";//构造函数内能够使用OC对象来赋值
  7. }
  8. TestC(NSString *str) {//函数能够接收OC对象(通过函数參数)
  9. str_ = str;
  10. }
  11. TestC(NSInteger num) {
  12. str_ = [NSString stringWithFormat:@"%d",num];//C++函数能够调用OC方法
  13. }
  14. void show() {
  15. printf("%s\n",[str_ UTF8String]);
  16. NSLog(@"str_ is:%@\n",str_);
  17. }
  18. };
这是我写的C++类,类内部使用了OC的代码。依据測试能够确定下面几点:

1. C++函数内能够调用OC方法、能够创建OC对象、函数參数能够为OC对象。

2. C++类的成员变量能够是OC对象。

事实上,在混编时,OC和C++的对象都是单纯的指针。所以能够随意的彼此调用对方的方法、使用对方的内部数据。

再来看看OC中是怎样使用C++代码的:

[java]view plaincopy

  1. @interface TestOC : NSObject
  2. {
  3. TestC *c;//能够使用C++对象作为參数
  4. }
  5. - (id)initTestOC;
  6. - (void)testC;
  7. @end
  8. @implementation TestOC
  9. - (id)initTestOC{
  10. if ((self = [super init])) {
  11. c = new TestC();//以C++语法调用构造函数
  12. }
  13. return self;
  14. }
  15. - (void)testC{
  16. c->show();//调用C++类的内部函数
  17. }
  18. - (void)dealloc{
  19. delete c;//用完 记得删除C++对象,避免内存泄露
  20. [super dealloc];
  21. }
  22. @end
和之前分析c++类没啥差别,毅然是能够使用c++的语法 能够使用c++的方法和成员。

另一点要注意,OC类无法继承C++类,C++也一样。

由于oc类的结构和c++类结构不同,所以才导致该问题。