C++、Objective-C 混合编程
2016-05-23 09:08
393 查看
在XCODE中想使用C++代码,你需要把文件的扩展名从.m改成.mm,这样才会启动g++编译器。
我们来看个测试代码:
[java]
view plain
copy
class TestC {
private:
NSString *str_;//C++类可以使用OC对象作为成员变量
public:
TestC() {
str_ = @"hi mc0066.";//构造函数内可以使用OC对象来赋值
}
TestC(NSString *str) {//函数可以接收OC对象(通过函数参数)
str_ = str;
}
TestC(NSInteger num) {
str_ = [NSString stringWithFormat:@"%d",num];//C++函数可以调用OC方法
}
void show() {
printf("%s\n",[str_ UTF8String]);
NSLog(@"str_ is:%@\n",str_);
}
};
这是我写的C++类,类内部使用了OC的代码。根据测试可以确定以下几点:
1. C++函数内可以调用OC方法、可以创建OC对象、函数参数可以为OC对象。
2. C++类的成员变量可以是OC对象。
其实,在混编时,OC和C++的对象都是单纯的指针,所以可以任意的彼此调用对方的方法、使用对方的内部数据。
再来看看OC中是如何使用C++代码的:
[java]
view plain
copy
@interface TestOC : NSObject
{
TestC *c;//可以使用C++对象作为参数
}
- (id)initTestOC;
- (void)testC;
@end
@implementation TestOC
- (id)initTestOC{
if ((self = [super init])) {
c = new TestC();//以C++语法调用构造函数
}
return self;
}
- (void)testC{
c->show();//调用C++类的内部函数
}
- (void)dealloc{
delete c;//用完 记得删除C++对象,避免内存泄露
[super dealloc];
}
@end
和之前分析c++类没啥区别,毅然是可以使用c++的语法 可以使用c++的方法和成员。
还有一点要注意,OC类无法继承C++类,C++也一样。因为oc类的结构和c++类结构不同,所以才导致该问题。
提供一个示例:
有时候,出于性能或可移植性的考虑,需要在iOS项目中使用到C++。
假设我们用C++写了下面的People类:
[cpp]
//
// People.h
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#ifndef __MixedWithCppDemo__People__
#define __MixedWithCppDemo__People__
#include <iostream>
class People
{
public:
void say(const char *words);
};
#endif /* defined(__MixedWithCppDemo__People__) */
[cpp] view plaincopy
//
// People.cpp
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#include "People.h"
void People::say(const char *words)
{
std::cout << words << std::endl;
}
然后,我们用Objective-C封装一下,这时候文件后缀需要为.mm,以告诉编译器这是和C++混编的代码:
[cpp]
//
// PeopleWrapper.h
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#import <Foundation/Foundation.h>
#include "People.h"
@interface PeopleWrapper : NSObject
{
People *people;
}
- (void)say:(NSString *)words;
@end
[cpp] view plaincopy
//
// PeopleWrapper.mm
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#import "PeopleWrapper.h"
@implementation PeopleWrapper
- (void)say:(NSString *)words
{
people->say([words UTF8String]);
}
@end
最后,我们需要在ViewController.m文件中使用PeopleWrapper:
[cpp]
PeopleWrapper *people = [[PeopleWrapper alloc] init];
[people say:@"Hello, Cpp.\n"];
[people release], people = nil;
结果发现编译通不过,提示“iostream file not found”之类的错误。
这是由于ViewController.m实际上也用到了C++代码,同样需要改后缀名为.mm。
修改后缀名后编译通过,可以看到输出“
Hello, Cpp.
”。
我们来看个测试代码:
[java]
view plain
copy
class TestC {
private:
NSString *str_;//C++类可以使用OC对象作为成员变量
public:
TestC() {
str_ = @"hi mc0066.";//构造函数内可以使用OC对象来赋值
}
TestC(NSString *str) {//函数可以接收OC对象(通过函数参数)
str_ = str;
}
TestC(NSInteger num) {
str_ = [NSString stringWithFormat:@"%d",num];//C++函数可以调用OC方法
}
void show() {
printf("%s\n",[str_ UTF8String]);
NSLog(@"str_ is:%@\n",str_);
}
};
这是我写的C++类,类内部使用了OC的代码。根据测试可以确定以下几点:
1. C++函数内可以调用OC方法、可以创建OC对象、函数参数可以为OC对象。
2. C++类的成员变量可以是OC对象。
其实,在混编时,OC和C++的对象都是单纯的指针,所以可以任意的彼此调用对方的方法、使用对方的内部数据。
再来看看OC中是如何使用C++代码的:
[java]
view plain
copy
@interface TestOC : NSObject
{
TestC *c;//可以使用C++对象作为参数
}
- (id)initTestOC;
- (void)testC;
@end
@implementation TestOC
- (id)initTestOC{
if ((self = [super init])) {
c = new TestC();//以C++语法调用构造函数
}
return self;
}
- (void)testC{
c->show();//调用C++类的内部函数
}
- (void)dealloc{
delete c;//用完 记得删除C++对象,避免内存泄露
[super dealloc];
}
@end
和之前分析c++类没啥区别,毅然是可以使用c++的语法 可以使用c++的方法和成员。
还有一点要注意,OC类无法继承C++类,C++也一样。因为oc类的结构和c++类结构不同,所以才导致该问题。
提供一个示例:
有时候,出于性能或可移植性的考虑,需要在iOS项目中使用到C++。
假设我们用C++写了下面的People类:
[cpp]
//
// People.h
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#ifndef __MixedWithCppDemo__People__
#define __MixedWithCppDemo__People__
#include <iostream>
class People
{
public:
void say(const char *words);
};
#endif /* defined(__MixedWithCppDemo__People__) */
[cpp] view plaincopy
//
// People.cpp
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#include "People.h"
void People::say(const char *words)
{
std::cout << words << std::endl;
}
然后,我们用Objective-C封装一下,这时候文件后缀需要为.mm,以告诉编译器这是和C++混编的代码:
[cpp]
//
// PeopleWrapper.h
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#import <Foundation/Foundation.h>
#include "People.h"
@interface PeopleWrapper : NSObject
{
People *people;
}
- (void)say:(NSString *)words;
@end
[cpp] view plaincopy
//
// PeopleWrapper.mm
// MixedWithCppDemo
//
// Created by Jason Lee on 12-8-18.
// Copyright (c) 2012年 Jason Lee. All rights reserved.
//
#import "PeopleWrapper.h"
@implementation PeopleWrapper
- (void)say:(NSString *)words
{
people->say([words UTF8String]);
}
@end
最后,我们需要在ViewController.m文件中使用PeopleWrapper:
[cpp]
PeopleWrapper *people = [[PeopleWrapper alloc] init];
[people say:@"Hello, Cpp.\n"];
[people release], people = nil;
结果发现编译通不过,提示“iostream file not found”之类的错误。
这是由于ViewController.m实际上也用到了C++代码,同样需要改后缀名为.mm。
修改后缀名后编译通过,可以看到输出“
Hello, Cpp.
”。
相关文章推荐
- flask添加权限的时候出现TypeError: ObjectId('') is not JSON
- object KVC\KVO 简介
- #object C runtime 简介
- Yii框架中属性概念及Object基类的分析
- Xcode之启动(打开)僵尸对象(Enable Zombie Objects)
- Java之面向对象Object类
- Foundation => Objective-C - NSDate & NSCalendar
- 【Android】Android ObjectAnimator动画初识、模仿
- IOS学习笔记——object-C基础 (二)
- Java IO - ObjectInputStream&ObjectOutputStream
- 使用Object-C实现23种设计模式之建造者模式
- JSONObject使用心得
- instancetype、id、NSObject的区别
- JSONObject和JSONArray的使用 以及JSONObject put,accumulate,element的区别
- Objective-C ---代理和协议 (梳理整理)
- Objective-C ---点语法 (梳理整理)
- QObject源码分析
- Programming Scala第4章demo03 单例对象object
- javascript之object
- Objective-C ---点语法 (梳理整理)