Object-c

开源公司:布莱德·考克斯

作品详情

中文名
扩充C的面向对象编程语言
展开
简写
ObjC&OC
展开
创始人
类型系统
静态类型、动态类型、弱类型
展开
主要实现产品
Glang、GCC
展开
影响语言
Java、Objective-J、TOM、Nu语言、Swift
展开
外文名
Objective-C
展开
适用领域
计算机
展开
创始时间
1980年代
展开
操作系统
跨平台
展开
启发语言
展开




1发展历史






早期发展



Objective-C 主要由Stepstone公司的布莱德·考克斯(Brad Cox)和汤姆·洛夫(Tom Love) 在 1980 年代发明。


1981年 Brad Cox 和 Tom Love 还在ITT 公司技术中心任职时,接触到了SmallTalk语言。Cox 当时对软件设计和开发问题非常感兴趣,他很快地意识到SmallTalk语言在系统工程构建中具有无法估量的价值,但同时他和 Tom Love 也明白,当前ITT 公司的电子通信工程相关技术中,C 语言被放在很重要的位置。


于是 Cox 撰写了一个 C 语言的预处理器,打算使 C 语言具备些许 Smalltalk 的本领。Cox 很快地实现了一个可用的 C 语言扩展,此即为 Objective-C语言的前身。到了 1983 年,Cox 与 Love 合伙成立了 Productivity Products International(PPI)公司,将 Objective-C 及其相关库商品化贩售,并在之后将公司改名为StepStone。1986年,Cox 出版了一本关于 Objective-C 的重要著作《Object-Oriented Programming, An Evolutionary Approach》,书内详述了 Objective-C 的种种设计理念。


1988年,斯蒂夫·乔布斯(Steve Jobs)离开苹果公司后成立了NeXT Computer公司,NeXT 公司买下 Objective-C 语言的授权,并扩展了著名的开源编译器GCC使之支持 Objective-C 的编译,基于 Objective-C 开发了AppKit与Foundation Kit等库,作为 NeXTSTEP 的的用户界面与开发环境的基础。虽然 NeXT 工作站后来在市场上失败了,但 NeXT 上的软件工具却在业界中被广泛赞扬。这促使 NeXT 公司放弃硬件业务,转型为销售NeXTStep(以及OpenStep)平台为主的软件公司。


1992年,自由软件基金会的 GNU 开发环境增加了对 Objective-C 的支持。1994年,NeXT Computer公司和Sun Microsystem联合发布了一个针对 NEXTSTEP 系统的标准典范,名为 OPENSTEP。OPENSTEP 在自由软件基金会的实现名称为GNUstep。1996年12月20日,苹果公司宣布收购 NeXT Software 公司,NEXTSTEP/OPENSTEP环境成为苹果操作系统下一个主要发行版本OS X的基础。这个开发环境的版本被苹果公司称为Cocoa。


2005年,苹果电脑雇用了克里斯·拉特纳及LLVM开发团队[2],clang及LLVM成为苹果公司在GCC之外的新编译器选择,在Xcode4.0之后均采用 LLVM 作为默认的编译器。最新的 Modern Objective-C 特性也都率先在 Clang 上实现。





版本迭代



Objective-C++


Objective-C++是GCC的一个前端,它可以编译混合了C++与Objective-C语法的源文件。Objective-C++是C++的扩展,类似于Objective-C是C的扩展。由于在融合C++与Objective-C两种语言的特性方面没有做特别的工作,因此有以下限制:


·C++类不能从Objective-C类继承,反之亦然。


·Objective-C定义内部不能定义C++名字空间。


·Objective-C类的成员变量不能包括不含默认构造函数和/或含有虚方法的C++类对象,但使用C++类指针并无如此限制(可以在 -init方法中对之进行初始化)。


·C++“传递值”的特性不能用在Objective-C对象上,而只能传递其指针。


·Objective-C声明不能存在在C++模板声明中,反之亦然。但Objective-C类型可以用在C++模板的参数中。


·Objective-C和C++的错误处理语句不同,各自的语句只能处理各自的错误。


·Objective-C错误使得C++对象被退出时,C++析构函数不会被调用。新的64位运行时解决了这个问题。


Objective-C 2.0


在2006年7月苹果全球开发者会议中,Apple宣布了“Objective-C 2.0”的发布,其增加了“现代的垃圾收集,语法改进,运行时性能改进,以及64位支持”。2007年10月发布的Mac OS X v10.5中包含了Objective-C 2.0的编译器。


Modern Objective-C


苹果公司在 WWDC2012 大会上介绍了大量 Objective-C 的新特性,能够让程序员更加高效地编写代码,这些新特性在 Xcode4.4 版本中已经可以使用。


·Object Literals


·默认生成 @synthesize 代码


·遍历元素


·Subscripting Methods





2语言特点






基本特点



Objective-C是非常实用的语言。它是一个用C写成很小的运行库,令应用程序的尺寸增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反。Objective-C写成的程序通常不会比其原始码大很多。而其函式库(通常没附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。因此,Objective-C它完全兼容标准C语言(C++对C语言的兼容仅在于大部分语法上,而在ABI(Application Binary Interface)上,还需要使用extern "C"这种显式声明来与C函数进行兼容),而在此基础上增加了面向对象编程语言的特性以及Smalltalk消息机制。[1]


Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的死亡时间,令整个系统失去功用。Objective-C为避免此问题才不拥有这个功能。虽然某些第三方版本已加入这个功能(尤是GNUstep), Apple在其Mac OS X 10.3中仍未引入这个功能。


虽然Objective-C是C的超集,但它不是C的基本类型为第一级的对象。





消息传递


Objective-C最大的特色是承自Smalltalk的消息传递模型(message passing),此机制与今日C++式之主流风格差异甚大。Objective-C里,与其说对象互相调用方法,不如说对象之间互相传递消息更为精确。此二种风格的主要差异在于调用方法/消息传递这个动作。C++里类别与方法的关系严格清楚,一个方法必定属于一个类别,而且在编译时(compile time)就已经紧密绑定,不可能调用一个不存在类别里的方法。但在Objective-C,类别与消息的关系比较松散,调用方法视为对对象发送消息,所有方法都被视为对消息的回应。所有消息处理直到运行时(runtime)才会动态决定,并交由类别自行决定如何处理收到的消息。也就是说,一个类别不保证一定会回应收到的消息,如果类别收到了一个无法处理的消息,程序只会抛出异常,不会出错或崩溃。




异同



Objective-C同C++的异同:


和C++不同,Objective-C不支持运算子重载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。


Objective-C和C++的比较


单一继承:


和Java、Smalltalk一样,Objective-C不支持多重继承,而C++语言支持多重继承。


动态:


Objective-C是动态定型(dynamicaly typed),它的类库比C++容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。


C++ 跟从面向对象编程里的Simula 67(一种早期OO语言)学派,而Objecive-C属于Smalltalk学派。


在C++里,对象的静态类型决定你是否可以发送消息给它,而对Objective-C来说,由动态类型来决定。Simula 67学派更安全,因为大部分错误可以在编译时查出。 而Smalltalk学派更灵活,比如一些Smalltalk 看来无误的程序拿到Simualr67那里就无法通过。


从很多方面来看,C++和Objective-C的差别,与其说是技术上的, 不如说是思维方式上的。你是否想更安全而舍弃灵活性?Simular67学派的支持者称既然程序设计出色何必再要灵活性,而 Smalltalk学派则称为了灵活可以容忍运行时多出错。





优缺点



Apple在其Mac OS X10.3中仍未引入垃圾回收这个功能。不过令人欣慰的是在Apple发布的Xcode4中已经支持自动释放(不等同于严格意义上的垃圾回收,因为两者机制不同)。在Xcode4中的自动释放,也就是ARC(Automatic Reference Counting)机制,不需要用户手动去Release一个对象,而是在编译期间,编译器会自动帮你添加[NSObject release]。


另一个问题是Objective-C不包括命名空间机制(namespace mechanism),取而代之的是程序设计师必须在其类别名称加上前缀,时常引起冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类和函数均有“NS”作为前缀,例如NSObject或NSButton,以表明它们属于Mac OS X核心(使用“NS”是由于这些类和函数在NeXT OpenStep开发时定下的)。


虽然Objective-C是C的超集,但它不视C的基本型为第一级的对象。


由于Objective-C使用动态运行时类型,而且所有的方法都是函数调用(有时甚至连系统调用(syscalls)也如此),很多常见的编译时性能优化技术失效(例如:内联函数、常数传播、交互式优化、纯量取代与聚集等)。这使得Objetive-C性能劣于类似的对象抽象语言(如C++)。不过Objective-C拥护者认为既然Objective-C运行时消耗较大,Objective-C本来就不应应用于C++或Java常见的底层抽象。





3HelloWord





{

{
();
}
;
}



4应用范围





Objective-C是编写以下应用的利器:



  • iOS操作系统

  • iOS应用程序

  • iPad OS操作系统

  • iPad OS应用程序

  • MacOS X操作系统

  • Mac OSX 上的应用程序


Objective-C的流行归功于iPhone的成功。编写iPhone应用程序的主要编程语言是Objective-C。




5争议





Objective-C的最初版本并不支持垃圾回收(garbage collection)。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的“死亡时间”,令整个系统失去功用,Objective-C为避免此问题才不拥有这个功能。某些第三方版本加入了这个功能(尤是GNUstep),苹果公司也在其Mac OS X 10.5中提供了实现。


另一个广受批评的问题是ObjC不包括名字空间机制(namespace mechanism)。取而代之的是程序员必须在其类别名称加上前缀,由于前缀往往较短(相比名字空间),这时常引致冲突。在2007年,在Cocoa编程环境中,所有Mac OS X类别和函数均有“NS”作为前缀,例如NSObject或NSButton来清楚分辨它们属于Mac OS X核心;使用“NS”是由于这些类别的名称在NeXTSTEP开发时定下。


虽然Objective-C是C的严格超集,但它也不视C的基本类型为第一级的对象。


和C++不同,Objective-C不支持运算符重载(它不支持ad-hoc多态)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外运行时间过重和二进制不兼容。[来源请求]


由于Obj-C使用动态运行时类型,而且所有的方法都是函数调用(有时甚至连系统调用(syscalls)也如此),很多常见的编译时性能优化方法都不能应用于Obj-C(例如:内联函数、常数传播、交互式优化、纯量取代与聚集等)。这使得Obj-C性能劣于类似的对象抽象语言(如C++)。不过Obj-C拥护者认为Obj-C本就不应应用于C++或Java常见的底层抽象,Obj-C的应用方向是对性能要求不大的应用。



6词条图册



声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
案例
1、独立负责项目开发 2、只负责移动端设计开发 3、本人从业7年做过电商,体育,医疗,金融等项目,有着丰富的项目经验 4、本人精通OC,熟悉vue,java能够给您带来最大的方便
1、独立负责项目开发 2、只负责移动端设计开发 3、本人从业7年做过电商,体育,医疗,金融等项目,有着丰富的项目经验 4、本人精通OC,熟悉vue,java能够给您带来最大的方便
主要服务于煤炭行业的运输体系,旨在帮助货运司机找到合适的货物,并帮助货主找到合适的车辆。通过提供高效的物流解决方案,我们致力于改善煤炭行业的运输效率和降低成本。 个人职责方面,我主要负责以下工作: 1. CRM 新功能开发:根据客户需求和反馈,我与团队合作开发了 CRM 系统的新功能,以提升用户体验和满足业务需求。这些功能包括订单管理、客户管理、报表分析等。 2. App 账户体系完善:我负责完善 App 的账户体系,确保用户能够方便地注册、登录和管理个人信息。我还参与了账户安全策略的制定和实施,保护用户信息的安全。 3. App 后台业务 bug 修复及新功能开发:作为 App 后台开发人员
1. 负责产品接口开发:作为技术团队的核心成员,我负责与产品经理、UI 设计师和前端开发人员等密切合作,确保产品界面的交互效果和用户体验达到最佳状态。我需要熟悉各种前后端技术栈,并能够根据产品需求进行合理的架构设计和接口实现,保证数据传输的安全性和稳定性。 2. 负责团队管理:作为技术团队的负责人,我需要对团队成员进行有效的管理和指导,确保他们能够充分发挥自己的潜力,为项目的成功做出贡献。我需要制定明确的工作计划和目标,并通过定期的绩效评估和培训等方式提高团队成员的工作效率和质量。 3. 需求对接:作为项目经理,我需要与产品经理、业务团队等进行深入的需求沟通和讨论,确保产品需求的准确理解和高质
1850电商APP零售电商vuemysql
先后实现华润水泥控股28家基地的系统应用,实现能源、生产、设备、环保等业务的集中化应用,打造成为国家能源管理中心示范、国家智能制造示范、广东省工业互联网应用标杆,并入选国家节能典型案例库,成为水泥及众多行业企业的智能化应用标杆。 一、能源管理及生产调度平台主要功能模块: 1、数字工厂 管理看板 实时监控 2、能效分析 KPI分析 能效对标 绩效报告 能流图 3、生产调度 出厂量 产量 库存 4、环保管理 环保监控 环保报表 5、报表分析 查询分析 常用报表 固定报表 自动抄表 6、异常诊断 通讯异常 采集点异常 KPI异常 接口异常 7、数字建模 数据单元 指标管理 采集点管理 8、数据服务
当前共378个项目

评论