小伙伴想知道深入理解OC/C++闭包的话题,关于如何求传递闭包这类相关题,小编为你详细的解一下吧!
背景
Apple的Objective-C编译器允许用户在同一个源文件中自由混合C++和Objective-C。这种混合语言称为Objective-C++。与其他语言和C++的文件隔离和桥接通信相比,Objective-C和C++的同一个文件混合方式无疑是舒服的。虽然OC/C++混合编译可以写在一个文件中,但是有一些需要注意的地方Objective-C++并没有在OC类中添加C++函数,也没有在C++中添加OC函数。例如不能用OC语法调用C++对象不能给OC对象添加构造函数和析构函数,this和self也不能互换使用。类的架构是独立的。C++类不能继承OC类,OC类也不能继承C++类。
本文主要探讨之前OCBlock与C++lambda混合的困惑题。
实验环境C++版本为C++14,OC仅限ARC。
基本了解
在深入探讨之前,我们先通过比较来了解一下两者
语法
^intx,NSStringy//ObjC,采用int和NSString[]intx,std:stringy//C++,采用int和std:string^//ObjC,返回int[]//C++,返回int^int[]-gt;int原理
对于OC的Block底层,可以参考《深入研究Block对外部变量的捕获及__block实现原理》。这里我们不深入深究,只是展开代码来达到一个对比效果。
-无效viewDidLoad;区块5;通过clang-rewrite-objc重写,可以得到如下结果
struct__ViewController__viewDidLoad_block_impl_0;staticvoid__ViewController__viewDidLoad_block_func_0struct__ViewController__viewDidLoad_block_impl_0__cself,int静态结构__ViewController__viewDidLoad_block_desc_0__ViewController__viewDidLoad_block_desc_0_DATA=;静态无效_I_ViewController_viewDidLoadViewControllerself,SEL_cmd,sel_registerName34;整数x=3;voidblockint=voidint__ViewController__viewDidLoad_block_impl_0void__ViewController__viewDidLoad_block_func_0,__ViewController__viewDidLoad_block_desc_0_DATA,x;void__block_impl,int__block_implblock-gt;FuncPtr__block_implblock,5;C++lambda采用完全不同的实现机制,将lambda表达式转换为匿名C++类。让我们借助cppinsights来看看C++lambda的实现。
包括lt;cstdiogt;structA;intmain;整数米=3;类__lambda_12_15private:Aa;整数米;public:__lambda_12_15A_a,int_m:a,m;__lambda_12_15添加=__lambda_12_15;米=30;添加运算符20;返回0;可以看到,lambda表达式add被转换为类__lambda_12_15,并且重载了该运算符,并且对add的调用也被转换为对addoperator的调用。
捕获变量
OCBlock只能通过普通方法和__block方法来捕获变量
intx=42;void^blockvoid=^;块;//打印42__blockintx=42;void^blockvoid=^;block;//x现在为43C++lambda带来了更多的灵活性,你可以通过以下方式来捕获变量
[]不捕获任何内容[]通过引用捕获任何引用的变量[=]通过复制捕获任何引用的变量[=,foo]通过复制捕获任何引用的变量,但通过引用捕获变量foo[bar]通过复制捕获bar复印件;donc-扩展
今天跟各大网友分享的是深入理解OC/C++闭包,和如何求传递闭包对应的一些相关话题,希望对大家有所帮助。
发表评论