这个问题在这里经常出现,即使只是在用户错误标记他们的 iOS 问题时隐含地出现。那么,Xcode、Objective-C 和 Cocoa 有什么区别呢?
3 回答
Objective-C 是一种编程语言。可以说,它只是对有效的 Objective-C 程序的外观和含义的描述。如果你有一个用 Objective-C 编写的源代码清单,你需要一个解释器或编译器来让这个清单工作。像 Objective-C 这样的语言通常是经过编译的,所以大多数人使用编译器(比如LLVM)。Objective-C 几乎专门用于开发 iOS 和 OS X,但也有其他用途——例如,有些人为 Linux 编写 Objective-C。
您可以使用文本编辑器编写源代码并使用编译器将它们转换为实际程序,但使用现代技术需要处理的事情更多,因此还有另一个程序可以让您的工作更轻松。这些被称为集成开发环境或 IDE。IDE 为您提供了一种方便的方式来编辑源代码、编译它们、调试生成的程序、阅读文档以及许多其他事情。Xcode 就是这样一种 IDE。这里的一个重要观察是 Xcode 本身不会编译您的源代码,它只是调用独立编译器 (LLVM)。而且 Xcode 并不是您可以用来开发 Objective-C 应用程序的唯一 IDE——例如,还有 AppCode。
每次从头开始编写 iOS 或 OS X 应用程序将非常耗时。这就是为什么 Apple 为开发人员提供了一套好的库。这些库只是 Apple 编写的大量源代码,这些源代码处理了应用程序的大部分共同点。这些库称为 Cocoa。
现在,如果你不知道如何扩展一个类,你很可能在谈论 Objective-C。它与 Xcode 或 Cocoa 没有任何关系,您可以使用 Vim 作为 IDE 和 GCC 作为编译器为 Linux编写一些GNUstep代码。另一方面,如果您的 Xcode 构建过程由于某些神秘设置而失败,或者您尝试在 Xcode 中构建静态库,那么这显然是 Xcode 问题。如果你不知道如何使用一些 NSObject 工具或 NSFileManager 类,那就是 Cocoa。(但它不必与 Xcode 相关,因为您可以使用 AppCode 或 TextMate 作为您的 IDE!)
最初可在我的博客上找到。在重新标记或解释差异时,请随意链接到博客文章或此问题。
Xcode 是集成开发环境 (IDE)——开发人员用来为 iOS 和/或 OS X 编写软件的应用程序。它包括编辑器、构建系统(确定构建什么来生成所需的目标),以及相当多的其他几件事。
Objective-C 是开发人员编写此类软件的主要语言。他们可以用纯 C 编写它的一部分,使用 C++ 或将其与 Objective-C 结合(产生 Objective-C++),或者用另一种语言编写部分或全部程序完全语言,例如 MacRuby、Java(使用 j2objc)或 C#(使用 MonoTouch)。
Xcode 包括 Clang 编译器,它将用 Objective-C、C 和其他一些语言编写的代码转换为可执行代码。大多数错误消息来自 Clang,Xcode 严重依赖它来搜索索引、语法高亮和 Objective-C 代码的名称完成。
Cocoa 和 Cocoa Touch 是应用程序框架。每一个都是一组许多单独的框架(存储在名为 blahblah.framework 的文件夹中的库),例如:
- Foundation(两者):通用的面向对象实用程序,包括 NSString、NSURL、NSFileManager 等。
- Core Foundation(两者):大部分相同,但不同,主要在于拥有基于 C 的 API 而不是 Objective-C
- Application Kit (Mac):应用程序和窗口框架
- UIKit (iOS):应用程序和窗口框架
- 核心图形(两者):绘图
- 核心动画(两者):Sprite 管理和动画框架
(还有很多很多来自哪里,尤其是在 Mac 上)
所以:
- 您可以使用除 Cocoa 或 Cocoa Touch 之外的框架,但在某种程度上,您必须有一些Cocoa/Cocoa Touch 代码,以便您的应用程序与系统对话、接收事件、绘图等。目标 Mac 和/或 iOS 将包含不同质量级别的相关包装器。
- 您可以使用 Objective-C 之外的语言,但您会遇到很多语法上的尴尬,因为大部分 Cocoa 和 Cocoa Touch 都是针对 Objective-C 独特的语法特性(尤其是选择器)而设计的。
- 您可以使用 Xcode 之外的编辑器,甚至可以使用 Xcode 之外的构建系统(例如 make),但 Apple 的 App Store 期望应用程序以特定方式构建(尤其是在代码签名方面),所以除非您不是针对在 App Store 中,任何其他构建系统都必须复制 Xcode 所做的事情,否则会冒着被用户拒绝的风险。
一个明显的错误是未能将 Xcode 与其他一切区分开来。Xcode 是您用来编程的工具 - 用于编辑代码、运行代码等。因此,如果您在使用该工具时遇到问题(例如,窗口无法正确显示您的代码,或者您在绘图时遇到问题)你的界面等),这是一个 Xcode 问题。
如果你不明白为什么你的代码不起作用,你可能遇到了 Objective-C 问题或 Cocoa 问题。但你不一定知道是哪个。
如果您的问题根源在于您不知道该语言是如何工作的(例如,您不知道星号的用途,或者该声明不是实例化,或者发送给 nil 的消息不知道,那么这就是一个 Objective-C 问题出错但也不做任何事情)。
如果您不了解委托架构或视图控制器的工作原理,那么这是一个 Cocoa 问题。
但我对人们提出问题的方式的经验是,你可能不知道哪些是你不知道的。我不是指你个人,我指的是我们所有人。这会使正确提出问题变得困难,因为您不知道您不知道的到底是什么——如果您知道,您就会知道并且您可能不会遇到问题(您会正在解决问题并继续下一步)。