《IOS开发系列教程》IOS开发中使用C++

《IOS开发系列教程》IOS开发中使用C++

 

为大家说熟知的,开发IOS的app我们有两种语言可供选择,传统的Objective C和苹果在2014年底推出的Swift,然而如果你想使用C++呢,也是可以,就是在开发过程混用这两种语言。

好处就是,你可以省去学习Objective C的更深层次的时间成本,跟前台显示没有关系的代码,我们统统都可以C++来实现。

XCode支持一种混合型的语言,或者严格来说不是语言,而是编译机制(虽然苹果把它定义为Objective-C++),允许Objective C和C++在同一个文件中同时存在,这个文件有个要求就是以mm扩展名,这个区别Objective C的文件以 m扩展名,C++以cpp为扩展名。

 

不过要知道,xcode并没有支持在你创建文件的时候为你创建叫Objective-C++的文件。我们可以创建一个Objective C的文件,此时它的后缀名字是m,直接重命名为mm为扩展名。重命名之后可以看下这个文件的属性,type已经变成了 Objective-C++了。

然后在这个文件中你可以同时写C++和Objective C的代码了,例如:

#import <Foundation/Foundation.h>
#include <stdio.h>

@interface ocClass : NSObject
-(void) func1;
@end

@implementation ocClass
-(void) func1
{
    NSLog(@"oc func1 was called");
}
@end

class cppClass
{
public:
void func1( void )
{
     printf("cpp func1 was called\n");
}
}

void test()
{
        ocClass oc = [[ocClass alloc] init];
    [oc func1];
    cppClass *cc = new cppClass;
    cc->func1();
    delete cc;
}

int main( int argc, char*argv[])
{

    @autoreleasepool{
        test();
    };
    return 0;
}

将上面这段代码复制的默认的xcode生成的main.m文件中,然后重命名main.m为main.mm,然后编译运行,就会打出

oc func1 was called

cpp func1 was called

这里定义一个Objective C的类和一个C++的类,然后在C++的一个函数中调用创建这2个类实例,并调用他们的方法。

 

上面只是为了举例,在实际的开发中,非常不建议这么做,

1. 首先main.m尽量不要动它,让它保持越简单越好,只保留入口函数的功能即可

2. C++的大量代码放在cpp文件中,而不是mm文件中,mm文件作为C++类的wrapper(包装或者代理)来使用

所以上面文件变成

main.m——————————-

int main( int argc, char*argv[])
{

    @autoreleasepool{
        test();
    };
    return 0;
}

cppClass.h——————————————————–

class cppClass
{
public:
void func1( void )
{
     printf("cpp func1 was called\n");
}
}

cppClass.cpp ——————————————————–

#include <stdio.h>

cppClass::func1()
{
        printf("cpp func1 was called\n");
}

cppClassWrapper.h————————————————————

@interface ocClass : NSObject
-(void) func1;
@end

cppClassWrapper.mm———————————————————-

#include "cppClass.h"

@interface ocClass()
{
        cppClass *cc;
}

@implementation cppClassWrapper
-(void) func1
{
        cc = new cppClass;

        cc->func1();
}
@end

这里记住不要尝试在cppClassWrapper.h文件中

#include “cppClass.h"

和定义这个类指针

否则会有编译错误,而是在mm文件中做这些事情,将该类指针定义为cppClassWrapper的私有成员变量。

所以在ios开发中混合使用C++的模式就变成:

+——————————————————+                                

|  后台使用c++实现跟显示没有关系的代码 |       <——————–

+—————————————————–+

+——————————————————–+                                

|  中间的wrapper层对C++类做代理                |

|  wrapper类为objective C的类,类的方法中 | <——————–>

|  调用C++类的方法                                       |   

+——————————————————–+

+———————————————————————–+                                

|  前台(在各个IOS的viewcontroller中)调用wrapper类 |     

+———————————————————————-+

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章转载自:IT夜班车,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示