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. C编程的指针涛 ---第九笔记

    //这里说的是一个指针,指向算法的应用 //直接排序 //每个排序算法是指针指向的每个元件的特性的方便的交流 //这里的基本思想是,处理的记录的排序n - 1第二选择. //第i次操作选择i大(小)的 ...

  2. YII相关资料(干货)

    Sites 网站 yiifeed:Yii 最新动态都在这里 yiigist:Yii 专用的 Packages my-yii:Yii 学习资料和新闻 Docs 文档 Yii Framework 2.0 ...

  3. android App Widgets

    http://developer.android.com/guide/practices/ui_guidelines/widget_design.html#design http://develope ...

  4. Cygwin 是一个用于 Windows 的类 UNIX shell 环境

    cygwin的安装使用   Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...

  5. [置顶] Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  6. 【IOS开发】SimPholders的使用

    推荐一个Xocde开发工具 “SimPholders”,能够快速访问到你的模拟器文件夹,最重要的是完全免费! 官方地址

  7. D5

    今天的题目跟前几天的比起来简单了许多 由于T1没有开long long 所以T1全部WA掉了...只悲催的A了第二题 T1:多重背包 其实这一题我真心不会,DP各种弱,简直欲哭无泪... 不过认真的看 ...

  8. 算法打基础——符号&递归解法

    第二节 算法复杂度分析的的基本符号及 递归关系式下的复杂度解法 这次的主要知识点是: 1.各种复杂度符号  2.递归复杂度解法: 分为三种 替换法(猜!)   递归树法    主定理 1各种复杂度符号 ...

  9. C# BackgroundWorker组件学习

    C# BackgroundWorker组件学习  C# BackgroundWorker组件学习 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用Ba ...

  10. Bundles

    Bundles 接着在Global.asax文件的Application_Start方法中调用BundleConfig.RegisterBundles方法: protected void Applic ...