2010-06-06 95 views
22

我对Java有经验,想要学习Objective-C为iPhone编写应用程序。有什么根本的区别? (比其他的语法)objective-c和java之间的区别

+19

指向你的Java应用程序不会受到在它批准了随机给予的理由发表,主观和选择性...或包括任何点拒绝你的意思是编程语言吗? :) – 2010-06-06 01:29:00

+0

看看http://stackoverflow.com/questions/2641210/how-big-of-a-jump-will-it-be-to-go-from-c-to-objective-c/2641358 #2641358。不完全是Java与Objective-C,但可能仍然有帮助。 – 2010-06-06 01:32:30

+0

我太累了,无法正确使用“你的”和“你是”......失败:( – 2010-06-06 14:21:01

回答

2

最大的不同在于将立即影响到你,除了一个完全不同的一组库[1],是Objective-C不提供垃圾回收器。 Apple库提供了一些与垃圾收集相关的例程和对象,我相信使用引用计数,但是您没有Java中习惯的垃圾收集。除此之外,很多事情都是类似的:单一继承,后期绑定等。目标C不提供方法重载,但这是相当微不足道的差别。 Java和Objective-C在其对象模型的工作方式上并没有太大区别。 OBJ。 C有一些窍门,比如类别,但你不需要担心这些。

查看Remus建议的更多(和更详细的)信息(并感谢Remus提醒我关于图书馆的差异 - 我几乎忘记了那个重要的方面)C# question

29

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

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

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

在不相干的笔记中,使用Apple的工具构建您的UI更容易。界面构建器简单易用。将nib文件中的UI对象连接到代码中的声明非常简单。仪器提供了一种简单的方法来检查CPU使用情况,内存泄漏,分配等。此外,就功能,整体抛光和易用性而言,我会在任何一天将XCode和Apple的工具带到Eclipse中。

如果您在Java中“流利”,那么转向Objective-C并不会太难。准备好你的[]键并练习键入“释放”!

+0

我更喜欢IntelliJ到Eclipse,它比XCode好多了。我猜AppCode会更适合iOS开发者 – 2014-05-18 17:52:28

39

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

这可以让你做所有的排序时髦的东西,就像有一个对象姿势作为不同类的对象一样,你可以在运行时添加方法,或者在编译时向NSString等预构建类添加方法集合(称为类)。大多数情况下,除了类别之外,您从不打扰任何这些技巧。

在一个更实际的层面,你会发现:

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

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

+6

嗨,你说“所有的方法都是公开的”,我对这个陈述非常困惑,因为我认为你可以在实现.m文件中定义你的私有方法,只有来自.h文件的方法被视为公共类 – 2012-06-25 22:00:18

+3

@ TS.xy是的,您可以在实现文件中声明方法,并且会使用编译器警告标记使用实现文件的* outside *,但代码会编译并运行。在运行时没有使用“private”方法 – JeremyP 2012-06-26 10:06:53

+2

@JeremyP - 你可能想更新这篇文章来讨论ARC。 – 2013-04-12 19:52:20

0

目标C中声明的任何对象是另一个