详解iPhone开发之Objective-C和 C 混编
详解iPhone开发之Objective-C和 C 混编
本文介绍的是详解iPhone开发之Objective-C和C混编,介绍了iphone开发中的Objective-C的内容,先来看内容。
AD:
详解iPhone开发之Objective-C和C混编是本文要介绍的内容,主要介绍了iphone开发中的Objective-C和C混编,不多说,先来看详细内容。
苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就能够在Objective-C利用过程中利用已有的C++类库。
当心:Xcode必需源文件以".mm"为伸展名,这么能力启用编译器的Objective-C++伸展。
- #import <Foundation/Foundation.h>
- class Hello {
- private:
- id greeting_text; // holds an NSString
- public:
- Hello() {
- greeting_text = @"Hello, world!";
- }
- Hello(const char* initial_greeting_text) {
- greeting_text = [[NSString alloc] initWithUTF8String:initial_greeting_text];
- }
- void say_hello() {
- printf("%s/n", [greeting_text UTF8String]);
- }
- };
- @inte***ce Greeting : NSObject {
- @private
- Hello *hello;
- }
- - (id)init;
- - (void)dealloc;
- - (void)sayGreeting;
- - (void)sayGreeting:(Hello*)greeting;
- @end
- @implementation Greeting
- - (id)init {
- if (immolation = [super init]) {
- hello = new Hello();
- }
- return immolation;
- }
- - (void)dealloc {
- delete hello;
- [super dealloc];
- }
- - (void)sayGreeting {
- hello->say_hello();
- }
- - (void)sayGreeting:(Hello*)greeting {
- greeting->say_hello();
- }
- @end
- int main() {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- Greeting *greeting = [[Greeting alloc] init];
- [greeting sayGreeting]; // > Hello, world!
- Hello *hello = new Hello(xj.xjwmz.com"Bonjour, monde!");
- [greeting sayGreeting:hello]; // > Bonjour, monde!
- delete hello;
- [greeting release];
- [pool release];
- return 0;
- }
正如你能够在OC接口中声明C构造一样,你也能够在OC接口中声明C++类。跟C构造一样,OC接口中定义的C++类是大局范围的,不是OC类的内嵌类(这与规范C(尽管不是C++)晋级嵌套构造定义为文件范围是统一的)。
为了批准你基于语言变种条件化地编写代码,OC++编译器定义了__cplusplus和__OBJC__预处理器常量,离别指定C++和OC。如前所述,OC++不批准C++类继承自OC对象,也不批准OC类继承自C++对象。
- class Base { };
- @inte***ce ObjCClass: Base ... @end // ERROR!
- class Derived: public ObjCClass ... // ERROR!
与 OC不同的是,C++对象是静态种类的,有运行时多态是特异情形。两种语言的对象模型因而不能直接接受。更大约的,OC和C++对象在内存中的格局是互不相容的,也即便说,等闲不可能创立一个对象实例从两种语言的角度来看都是管用的。因而,两种种类层次构造不能被混杂。
你能够在OC类内部声明C++类,编译器把这些类当作已声明在大局名目空间来看待。就像下面:
- @inte***ce Foo {
- class Bar { ... } // OK
- }
- @end
- Bar *barPtr; // OK
OC批准C构造作为实例变量,不管它是否声明在OC声明内部。
- @inte***ce Foo {
- struct CStruct { ... };
- struct CStruct bigIvar; // OK
- } ... @end
Mac OS X 10.4尔后,万一你设置fobjc- call-cxx-cdtors编译器符号,你就能够利用包括虚函数和故含义的用户自定义零参数构造函数、析构函数的C++类实例来做为实例变量(gcc-4.2默认设置编译器符号fobjc-call-cpp-cdtors)。OC成员变量alloc完尔后,alloc函数会按声明次序调用构造器。构造器利用公共无参数稳妥的构造函数。OC成员变量dealloc之前,dealloc措施按声明次序反序调用调用析构函数。 OC没知名目空间得观念。不能在C++名目空间内部声明OC类,也不能在OC类里声明名目空间。
OC类,协议,分类不能声明在C++ template里,C++ template也不能声明在OC接口,协议,分类的范围内。
然而,OC类能够做C++ template的参数,C++ template参数也能够做OC消息表白式的空气压缩机接收者或参数(不能穿越selector)。
C++词汇歧义和抵触
OC头文件中定义了一些标识符,所有的OC过程定然包括的,这些标识符识id,Class,SEL,IMP和BOOL。
OC措施内,编译器预声明了标识符immolation和super,就想C++中的关键字this。跟C++的this不同的是,immolation和super是上下文相干的;OC措施外他们还能够用于等闲标识符。
协议内措施的参数列表,有5个上下文相干的关键字(oneway,in,out,inout,bycopy)。这些在其他内容中不是关键字。
从 OC过程员的角度来看,C++添置了不少新的关键字。你依旧能够利用C++的关键字做OC selector的一局部,因而波及并不严重,但你不能利用他们命名OC类和实例变量。例如,尽管class是C++的关键字,然而你依旧能够利用 NSObject的措施class:
- [foo class]; // OK
然而,因为它是一个关键字,你不能用class做变量名目:
- NSObject *class; // Error
OC里类名和分类名有独自的命名空间。@inte***ce foo和@inte***ce(foo)能够同时存在在一个源代码中。OC++里,你也能用C++中的类名或构造名来命名你的分类。
协议和template标识符利用语法雷同但目标不同:
- id<someProtocolName> foo;TemplateType<SomeTypeName> bar;
为了避免这种笼统之处,编译器不批准把id做template名目。最后,C++有一个语法歧义,当一个label后面跟了一个表白式表示一个大局名目时,就像下面:
- label: ::global_name = 3;
第一个冒号后面必需空格。OC++有相仿情形,也必需一个空格:
- receiver selector: ::global_c++_name;
局限
OC++ 未曾为OC类添置C++的功能,也未曾为C++类添置OC的功能。例如,你不能用OC语法调用C++对象,也不能为OC对象添置构造函数和析构函数,也不能将this和immolation互相轮换利用。类的系统构造是自力更生的。C++类不能继承OC类,OC类也不能继承C++类。另外,多语言失常处理是不扶持的。也就是说,一个OC抛出的失常不能被C++代码捉拿,反到来C++代码抛出的失常不能被OC代码捉拿。尤其是那些能够轻率在阅读代码的时候觉察的讹谬,这些讹谬经常不轻率穿越机器上的测验分辨出来。
小结:详解iPhone开发之Objective-C和C混编的内容介绍完了,希望本文对你有所帮助!
详解iPhone开发之Objective-C和 C 混编相关推荐
- 第五章 处理器拦截器详解——跟着开涛学SpringMVC
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- 详解iPhone Tableview分批显示数据
iPhone Tableview分批显示数据是本文要介绍的内容,主要讲解的是数据的显示.iPhone屏幕尺寸是有限的,如果需要显示的数据很多,可以先数据放到一个table中,先显示10条,table底 ...
- 伤害世界怎么自建服务器,《伤害世界Hurtworld》服务器架设方法图文详解 怎么开服?...
<伤害世界Hurtworld>服务器架设方法图文详解 怎么开服? 2015-12-19 22:29:52来源:贴吧编辑:评论(0) <伤害世界Hurtworld>中很多玩家不知 ...
- 【无限互联】iOS开发视频教程— 2.8 iPhone开发之swtch语句
核心内容 1. switch语句语法 2. 防止case穿透,与break结合使用 视频地址:iPhone开发之swtch语句
- iphone开发之Google地图实现…
原文地址:iphone开发之Google地图实现 学习随笔 作者:若水一叶 摘自博文:http://tergol.blog.163.com/blog/static/170695028201081961 ...
- iphone开发之C++和Objective-C混编
C++和Objective-C混编(官方文档翻译) 原文网址: http://developer.apple.com/iphone/library/documentation/Cocoa/Concep ...
- 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.5 WM8960音频编解码芯片...
本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第2章,第2.5节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...
- iPhone开发之-iPhone 安装文件的三种格式
原文地址:http://www.grubx.org/article.asp?id=284 DEB 其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 ...
- iphone屏幕镜像如何全屏_苹果系统截屏录屏+标记剪辑功能详解( iPhone/iPad/Mac)
苹果系统中的截屏和录屏.标记和剪辑功能一如它的其他产品设计,做得非常细致.在我们日常的工作中,不免会遇到这些功能,今天小编就给大家详细讲解下苹果系统截屏录屏.标记剪辑功能,希望对大家有所帮助! 001 ...
最新文章
- 【协议分析】Wireshark 过滤表达式实例
- @override注解可以不写吗
- 编写程序计算 sentence 中有多少个单词,并指出其中最长和最短的单词。如果有多个最长或最短的单词,则将它们全部输出。
- 2、压滤机现场图片和组成部分详细构造
- 西南交通大学计算机学院,西南交通大学2021年招生计划:四川招1830人、重庆招426人...
- poj 2318 TOYS
- PHP面向对象之继承和多态
- 计算机应用基础综合测试题b卷,10级《计算机应用基础》期末试卷B卷
- 计算机组成原理不恢复余数法,计算机组成原理第七讲(除法-原码恢复余数法)(科大罗克露)...
- PID参数整定快速入门(调节器参数整定方法)
- php元换成万元,元换算成万元换算器(元与万元的换算器)
- A,B,C,D,E五个人在某天夜里去捕鱼
- python如何攻击网站_GitHub - wuhuanyan/buy_pig_plan_python: 用Python写的『电话攻击,电话轰炸,电话炸弹』...
- [踩坑]packets.go:428: busy buffer invalid connection
- 【yoyo】移入切换
- 计算机网络:P3.1-数据链路层(上)
- (root) Additional property nginx is not allowed
- IE11更新导致部分网页显示不全、部分软件显示白屏、黑屏的解决办法
- 好心情患者故事|致抑郁症患者:我们能被治愈,也值得被爱
- HTML5 的一些新标签
热门文章
- 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)
- python安装依赖包经常出错怎么办_Python 下载依赖包环境经常失败超时解决方法...
- excel重复上一步快捷键_13个excel快捷键,让你的1秒钟,抵得上同事的5分钟
- android 不同项目代码合并在一块,android - 是否可以将两个(正在积极开发中的)Android应用程序模块合并到同一个Android Studio项目中? - 堆栈内存溢出...
- 用HTML制作表单表格能学到什么,Html学习之十七(表格与表单学习--排行版制作)...
- 报错,o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown column ‘template_name‘ in ‘field list‘
- 无心剑中译奥修《爱、婚姻与自由》
- Java学习笔记:BlockingQueue接口
- 利用R和Octave绘制函数图像和求解方程
- 【BZOJ3238】差异,后缀数组+单调栈维护height