Java接口与Objective-C正式协议类似,因为都需要实现     一组方法。Java具有抽象类,但Objective-C没有。Java具有类变量,但Objective-C中,可以使用文件范围内的全局变量并为它们提供对应的访问器。Objective-C的公共和私有方法的形式比较松散。在Objective-C中,对象支持的任何方法都可以被调用,即使它们没有以任何外部形式出现(例如头文件中)。Java允许声明final类,阻止更改其中的任何子类,而Objective-C则与此相反,允许在运行时向任何类添加方法。

Objective-C中类的实现方式可以分成两个文件,头文件和自身的实现文件。但并不是一定要这样划分(例如某些小的私有类),这在本书的某些代码中意境有所反映。头文件(带有.h扩展名)保留类的公开信息,例如使用此类的代码讲使用的任何新的枚举、类型、结构,以及代码。其他代码段使用预处理器(#import)导入该文件。Java中缺少C预处理器。C预处理器是一种文本替换工具,它能在C、Objective-C和C++源代码进行编译器之前,先对它们进行自动处理,以#开头的指令表示一个预处理器命令。C预处理器是一个功能非常强大但又危险的工具。很多编程人员都认为java中缺少预处理器是一个良好的特性。

在java中,几乎所有错误都是通过一场来处理的。而在Objcective-C中,错误处理的方式取决于所使用的API。Unix API通常会返回值-1和一个全局错误编号(error),以设置某个特定的错误,Cocoa API通常仅在编程人员出现或无法清除时才抛出异常。Objective-C语言提供的异常处理特性与java及C++类似,采用@try、@catch、和@finally结构。

在Objective-C中,空(零)对象采用nil表示,可以向nil对象发送消息,而不必担心出现NullPointerException异常。向nil对象发送的消息代表停止操作指令,因此,不必检查发送的消息是否为NULL。

在Objective-C中,通过使用类别向现有类中添加方法,可以改变类的行为。 Objective-C中没有类似于final的类。因为编译器需要知道超类定义的对象的大小,所以任何类只要包含子类头文件,就可以把它设置为子类。

实际上,相对于java而言,在Objective-C中很少使用子类化行为。因为,通过类别和动态运行时机制,可以想任何对象发送任何消息,可以将某些功能放到含有较少功能的类中,也可以将功能呢放到最有意义的类中。例如:可以在NSString上加入类别来添加反转字符串或删除所有空格等特征,然后可以在任何NSString类中调用该方法,无论调用来自何处。当然,你也可以使用自己的字符串子类来提供那些特性。

一般来说,只有当创建某个全新的对象(位于对象层次结构的顶部),或者需要从根本上改变某个对象的行为,或者由于类不能实现某个功能而需要使用子类时,才需要在Cocoa中设置子类,例如:Cocoa使用NSView类机构用户界面组件,却无法实现它的dramRect:方法。因此,需要试这NSView的子类并重写dramRect:方法来绘制视图。但对其他大多数对象,通常采用委托和数据源的方式。由于Objective-C可以想任何对象发送任何消息,对象不必含有特定的子类或遵从特定的接口,这样,单个类就可以成为任意个不同对象的委托和数据源。

因为类别中意境声明了数据源和委托方法,因此,不必实现所有的数据源和委托方法,在Objective-C中,Cocoa编程很少使用空存根方法,某些方法会在嵌入式对象中调用相同的方法来使编译器能够顺利底适应一种正式协议。

当然,功能越强,责任越大。Objective-C采用手动保留、释放和自动释放的内存管理系统,这样容易产生一些棘手的内存错误,在其他类中添加类别是一种功能强大的工作机制,但如果随意滥用,会降低代码的可读性,导致其他人无法理解。另外,Objective-C是以C为基础的,因此,可以使用C语言的所有特性,同事包括使用预处理器可能带来的危险,并可能出现与指针相关的内存管理错误。

Java 和 IOS 区别的更多相关文章

  1. React++ node.js ++SQL Sever ++MySQL++ python ++ php ++ java ++ c++ c#++ java ++ android ++ ios ++Linux+

    "C语言在它诞生的那个年代,是非常不错的语言,可惜没有OOP.当项目臃肿到一定程度,人类就不可控了. 为了弥补这个缺陷,C++诞生了.而为了应对各种情况,C++设计的大而全,太多复杂的特性, ...

  2. (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

    我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...

  3. C++与Java的语法区别

    C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...

  4. C++和java多态的区别

    C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报  转载自:http://www.cnblogs.com/plmnko/archive ...

  5. java的版本区别、下载、配置

    参考:http://blog.csdn.net/liujun13579/article/details/7684604 java的版本区别 常用的 java 程序分为  Java SE.Java EE ...

  6. 第一章.java&golang的区别之:闭包

    对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...

  7. java的this static public protected private abstract interface 在python的对应,java python一些区别

    1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...

  8. 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean

    7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...

  9. Android Library和Android APP、Java Library的区别

    Android Library和Android APP.Java Library的区别 Android Library在目录结构上与Android App相同,它能包含构建APP所需的一切(如源代码. ...

随机推荐

  1. js+css3动态时钟-------Day66

    昨天,有一天招,宽带到底没装上.相当恼火,不过包了一天租新房,有很多想法下来,其中,率先实现了--动态时钟(它已上载的资源,一些粗略的全貌.汗...) 这里记录.这个看似简单的功能,以达到良好的,我在 ...

  2. 用持续集成工具Travis进行构建和部署

    用持续集成工具Travis进行构建和部署 用持续集成工具Travis进行构建和部署 摘要:本文简单说明了如何使用持续集成工具Travis进行构建和部署的过程. 1. 概述 持续集成(Continuou ...

  3. 小公司免费的ERP软件

    http://www.2bizbox.cn/ https://www.odoo.com/

  4. QT添加exe文件的图标LOGO

    首先你需要一个ICO文件,这样的一个: 使用百度搜索到的在线工具直接生成一个ICO文件保存到本地就可以了 将这人LOGO.ico文件保存到自己的resource文件夹下 然后在工程中新建一个qrc文件 ...

  5. CSS移动

    #hand { width: 170px; height: 236px; position: absolute; top: 178px; left: 390px; background: url('h ...

  6. 日志分析工具-ApexSQL介绍

    原文:日志分析工具-ApexSQL介绍 使用场景:业务数据异常变化,通过代码分析不出来的时候,迫不得已需要通过日志来分析 下载地址:http://www.apexsql.com/Download.as ...

  7. python进程池剖析(三)

    之前文章对python中进程池的原理.数据流以及应用从代码角度做了简单的剖析,现在让我们回头看看标准库中对进程池的实现都有哪些值得我们学习的地方.我们知道,进程池内部由多个线程互相协作,向客户端提供可 ...

  8. C#:vs2010无法打开vs2012创建的项目

    vs低版本打开高版本创建的项目时会提示"选择的文件是解决方案文件,但是用此应用程序的较新版本创建的,无法打开" 解决办法: 写字板打开解决方案sln文件 将其改成你现在用的vs版本 ...

  9. 松瀚SN8P2711 2722 ADC初始化程序及应用--汇编源码

    /* 松瀚 SN8P2711 2722 ADC初始化程序 及应用实例 */ INIT_ADC: MOV A, #0XB2 // 启动ADC电路 使能AIN通道 B0MOV ADM, A MOV A,# ...

  10. 订单处理(c#实现)

    State模式的经典应用场景:订单处理(c#实现) State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了 ...