最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

C++與OC相互調(diào)用

標(biāo)簽:
iOS C++

前言

在开发 RTC 的过程中遇要一个棘手的问题,需要侦听iOS手机的音量键,然后根据音量的大小来处理一些逻辑。

我们是以老的 WebRTC代码为基础来开发自己的 RTC 库的。在老的 WebRTC中,对 iOS的 Native 代码的处理都是 C++风格的。

而要侦听iOS手机的音量键,又必须通过 KVO的 OC 方式才可以,也就是要向 AVAudioSession注册一个观察者对象来侦听音量键消息,如下所示:

[session addObserver:OCObject
          forKeyPath:@"outputVolume"
             options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
             context:nil]

上面函数中的 OCObject 必须是一个 NSObject 的OC 对象才行,一般的写法都是将 OCObject写成self。

但在我们的代码中是不行的,因为上面的代码是写在一个 C++ 类里的,而 self 这个关键字是属于 OC 的范畴,相当于C++中的this的意思,但又不是this。这就涉及到了 C++ 调用 OC,OC 再调用 C++的混合调用的情况。

要弄清楚的几个基本概念

要想让 OC 与 C++之间可以顺利的相互调用,我们必须要先弄明白下面几个基本概念:

  • 首先,我们要清楚一个概念,OC 与 C++ 对象在内存管理上是不一样的。所以我们无法直接将一个 OC 对象直接赋值给一个 C++ 对象,或者相反。

  • 第二点,OC 与 C++都支持指针,可以通过指针进行桥接。例如在一个 C++ 类中声名一个 OC的指针。

  • 第三点,也是最重要的一点,clang可以通过程序文件的后辍名选择不同的编译器对其进行编译。如文件后辍名是.m,它会使用 OC编译器;如果是.mm,它会使用 Object-C++编译器。而既用到 OC,又用到 C++ 的程序文件则应该使用.mm后缀。因为 Object-C++编译器可以识别出两种风格的语法,而OC编译器却不能。
OC 与 C++相互调用

在 C++ 中使用 OC 对象时,要引用 OC的头文件,引用 OC 头文件的语句是:

#import "header.h"

千万不要写成:

#include "header.h"

因为在C++文件中引入了 OC 的关键字#import,所以需要将.cpp文件后辍修改为.mm

另外,在.mm中可以直接写OC的语法,虽然OC与C++对象由于内存管理不同,无法直接相互赋值,但可以在 .mm文件中直接创建 OC对象,然后调用对象的方法。如下所示:

  • .mm中创建 C++对象,并调用其方法:
    TestCPP *tCPP = new TestCPP();
    tCPP->sayHello();
  • .mm中创建 OC 对象,并调用其方法:
    tOC = [[TestOC alloc] init];
    [tOC sayHello];
    遇到的坑

    如果你在 C++ 文件中用到 OC 语法,那么一定要将文件名后辍修改为 .mm,而且它们是嵌套的。比如某个.mm文件的头文件使用了#import引入了 OC文件,而又有其它的 .cpp文件引入了该 .mm的头文件,那么这个 .cpp文件也要修改为 .mm文件。

例子

git地址

结束

通过上面的讲解是不是觉得 OC 与 C++ 相互调用其实也蛮容易的?

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消