《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夜班车,否则按侵权处理.