Objective-C 使用 C++类

看了Horky同学的《混合使用Objective-C,C++和Objective-C++》博文,我也有些想法也记录一下,方便今后学习

1.Objective-C / C++ /C 深度混合不是一个好的选择,易容出错,也不好维护,当在Objective-C代码中使用C++类时,我们会使用等价的Objective-C类型和函数将C++代码封装(wrap)起来。

2.Objective-C头文件中不要引用C++的头文件,因为Objective-C中没有class这个关键字. 编译器会报Unknown type name ‘class‘; did you mean ‘Class‘?错误。

下面说一个列子方便理解

//PlayerWindowController.h  Objective-ct头文件

#import <Cocoa/Cocoa.h>

@interface PlayerWindowController : NSWindowController

{

@private

void *_player; //定义一个void *

}

- (BOOL) playURL:(NSURL *)url;

@end

//PlayerWindowController.mm  实现

#import "PlayerWindowController.h"

#include <libkern/OSAtomic.h>   //c++ 头文件

#include <AudioPlayer.h>          //c++类头文件

#include <AudioDecoder.h>       //c++类头文件

#define PLAYER (static_cast<AudioPlayer *>(_player))

static void decodingStarted(void *context, const AudioDecoder *decoder)

{

[(PlayerWindowController *)context decodingStarted:decoder];

}

static void renderingStarted(void *context, const AudioDecoder *decoder)

{

[(PlayerWindowController *)context renderingStarted:decoder];

}

static void renderingFinished(void *context, const AudioDecoder *decoder)

{

[(PlayerWindowController *)context renderingFinished:decoder];

}

@implementation PlayerWindowController

- (id) init

{

if(nil == (self = [super initWithWindowNibName:@"PlayerWindow"])) {

[self release];

return nil;

}

_player = new AudioPlayer();

return self;

}

 

- (BOOL) playURL:(NSURL *)url

{

AudioDecoder *decoder = AudioDecoder::CreateDecoderForURL(reinterpret_cast<CFURLRef>(url));

if(nullptr == decoder)

return NO;

PLAYER->Stop();

//注册播放器开始/结束消息,方便UI界面更新

decoder->SetDecodingStartedCallback(decodingStarted, self);

decoder->SetRenderingStartedCallback(renderingStarted, self);

decoder->SetRenderingFinishedCallback(renderingFinished, self);

return YES;

}

时间: 2024-07-29 03:01:36

Objective-C 使用 C++类的相关文章

Objective c类的初始化

Objective c中实现类的初始化要先重载父类的init方法: 1.首先调用[super init]使用父类的方法进行初始化.将对象赋给self 2.假设self不为nil即父类初始化成功,接着进行本类的初始化 3.返回self给调用者 @implementation Test -(id)init {     if(self = [super init])     {         //本类的初始化代码 //..........     }     return self;      }

iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性与其他语言(C++)类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objectiv

IOS-Swift、Objective-C、C++混合编程

1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的,所以如果需要在Objective-C调用C++语言就需要直接将后缀m文件改为mm,然后就可以调用C++代码了. Objective-C兼容C,Objective-C++兼容C.C++. 接下来是在OC工程中创建C++文件,并调用C++的代码: 然后在OC文件中直接用C++的语法调用C++,所以前提是

Objective中调用Swift代码

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc 步骤比较简单: 1.在Objective C工程中,创建新文件(command+N),选择Swift文件 2.选择创建bridge-header,后会生成两个文件,一个是bridge-header(这个暂时没用,这个文件是用来将objective c中的接口暴露给swift),一个是swift文件 3.在swift中想要暴露给objective C中的类或者方法前加上@objc关键字(@objc关键字的一

Swift中的错误处理

前言 任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃.良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性. 本文的Swift版本:Swift 3 Objective C 返回nil 如果出错了,就返回空是Objective C中的一种常见的处理方式.因为在Objective C中,向nil发送消息是安全的.比如: - (instancetype)init { self = [super init]; if (self) { } //如果初始化失败,会返回nil ret

利用 NSSortDescriptor 对 NSMutableArray 排序

有时我们在NSMutableArray中存的是网络请求返回的数据,而每一个元素又是一个NSDictionary,如果这时候需要把数组中的元素按照每个元素字典中某一个key来排序,那么我们可以利用Objective C中的类:NSSortDescriptor来快速实现需求. 通常会把排序的代码封装到一个方法中,比如下面这个方法: + (void) changeArray:(NSMutableArray *)dicArray orderWithKey:(NSString *)key ascendin

外贸网站设计时常遇见的名词中英文对照

随着我们与世界各个国家交流,与国际接轨,英语是我们必须学会的.网站中使用的英文则需要一定的专业度,因为中文的缩写表达及含义委婉丰富的特点,我们不能直接从文字上进行翻译.所以,以下为对自己英文水平没有信心的朋友收集整理了所有网站建设应用过程中经常需要用到的字词,大部份采集于国外英文网站上的现成素材. 公司介绍类栏目:公司简介:AboutUs/Introduction/Company Profile/The Company/Company brief董事长致词:Chairman's Note/Cha

objective - c 类和对象

知识点 1.初步认识 OC 2.xcode使用 3.面向对象编程思想,类和对象 4.类的定义和使用 5.类的实例化--对象 6.声明和实现相分离 =========================================== 1.需要理解的(理论部分) 第一部分:OC和面向对象 1.1.OC语言的历史,特点.重要程度 [什么是OC] objective - c   在C语言基础上开发, 面向对象的语言: 注意C语言和oc语言语法的区别: IOS, iphone, ipad … [进入OC

Objective-C 笔记二 类、对象和方法

对象就是一个物件.面向对象的程序设计可以看成一个物件和你想对它做的事情.这与C语言不同,C语言通常称为过程性语言.在C语言中,通常是先考虑要做什么,然后才关注对象,这几乎总是与面相对象的思考过程相反. 在面向对象的用语中,(这里我们以汽车作为对象)你的汽车是汽车的一个实例.car就是类的名称,这个实例就是从该类创建的.因此,每制造一辆新汽车,就会创建汽车类的一个新实例,而且汽车的每个实例都称为一个对象. 对象 使用对象执行的操作 你的汽车 驾驶 加油 洗车 维修 每个实例或对象不仅包含从制造商那

iOS Objective -C Runtime 运行时之一: 类与对象

// --------------------------------------------------- 参考:南峰子的技术博客 http://southpeak.github.io //---------------------------------------------------- OC语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们编写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等.