objective-c和java之间的区别

she*_*eLa 23 java objective-c

我对Java很有经验,想学习objective-c来为iPhone编写应用程序.有什么根本区别?(语法除外)

Jer*_*myP 42

从概念上讲,最大的区别是Objective-C是动态类型的,你不调用方法,你发送消息.这意味着Objective-C运行时不关心对象的类型,只关注它是否会响应您发送它的消息.这反过来意味着您可以(例如)使用objectForIndex:方法创建一个类,并使用它代替NSArray,只要使用它的代码只调用objectForIndex:

这允许您执行各种各样的时髦事物,例如将一个对象构成为不同类的对象,并且可以在运行时添加方法或在编译时将方法集合(称为类别)添加到预构建的类(如NSString).大多数时候,除了类别之外,你永远不会为任何这些技巧而烦恼.

在更实际的层面上你会注意到:

  • 语法不同
  • 内存管理更加手动.在iPhone上,你必须使用retain/release(OS X有垃圾收集).这实际上并不像听起来那么糟糕.如果您遵循规则,并将实例变量包装在getter和setter中,您将发现自己很少需要编写保留或释放.更新:在我写这篇文章后的一段时间,Apple引入了自动引用计数(ARC).ARC的观察结果表明,clang静态分析仪能够发现几乎每一个缺失(或额外)的保留或释放.因此,他们通过让编译器自动保留并释放来扩展原则.除了关于强弱关系的一些简单规则(即对象是否声称拥有另一个对象),您或多或少会忘记内存管理.此外,ARC可在iOS上使用.
  • 所有方法都是公开的.这是消息发送范例的直接结果,但您无法定义私有或受保护的方法.
  • 图书馆要小得多.特别是,您会注意到只有三个集合类NSArray,NSDictionary和NSSet(以及它们的可变版本).理念是您编程到界面.运行时担心实现应该是什么.

ETA:我忘记了一件重要的事情,你会错过Java.Objective-C不支持名称空间.这就是为什么你会看到带有两个(或更多)字母前缀的objective-C类,这是我真正希望他们添加的功能.

  • 嗨,你说"所有方法都是公开的",我对这个语句非常困惑,因为我认为你可以在实现.m文件中定义你的私有方法.只有.h文件中的方法被视为公共类. (6认同)
  • @ TS.xy是的,您可以在实现文件中声明方法,并使用编译器警告标记实现文件的*outside*,但代码将编译并运行.在运行时没有检查使用"私有"方法. (3认同)
  • @JeremyP - 你可能想更新这篇文章来讨论ARC. (2认同)

str*_*ark 29

首先,Objective-C没有为iPhone提供垃圾收集器.在Mac上,存在垃圾收集器.

但是,对我来说最大的区别可能是每个班级有2个文件.头文件(.h),您必须声明实例变量,属性和方法.然后是您编写方法的实现(.m)文件.Objective-C中的属性必须与@synthesize关键字"合成"以创建getter和setter方法.

转型并不算太糟糕.两种语言在对象模型甚至一些语法方面都遵循类似的规则.我实际上做了相反的过渡.我开始使用Objective-C for iPhone,然后选择Java进行Android开发.

在一个不相关的说明中,使用Apple的工具构建UI要容易得多.界面构建器简单明了.将nib文件中的UI对象连接到代码中的声明非常简单.仪器提供了一种检查CPU使用率,内存泄漏,分配等的简便方法.此外,就功能,整体打磨和易用性而言,我会随时将XCode和Apple的工具带到Eclipse.

如果你在Java中"流利",那么转向Objective-C并不会太难.只需准备好你的[]键并练习输入"发布"!


Mic*_*and 2

除了一组完全不同的库[1]之外,将立即影响您的最大区别是 Objective-C 不提供垃圾收集器。Apple 库提供了一些与垃圾收集相关的例程和对象,我相信使用引用计数,但您没有在 Java 中习惯的垃圾收集。

除此之外,许多事情都是相似的:单继承、后期绑定等。Objective C 不提供方法重载,但这是一个微不足道的区别。Java 和 Objective-C 在对象模型的工作方式方面相差并不远。对象。C 有一些技巧,例如类别,但一开始您不需要担心这些。

请参阅 Remus 建议的相关C# 问题以获取更多(以及更详细的)信息(并且感谢 Remus 提醒我库的差异 - 我几乎忘记了这个重要的方面)。