Cocoa还是Objective-C?

8
关于iPhone开发,如何区分使用了Cocoa还是纯Objective-C对象。例如下列属于Objective-C

  • NSTimer
  • NSString
  • int, float
  • NSMutableArray

但是这些属于Cocoa:

  • UILabel
  • UIColor(?)
  • UIView

需要明确的是:

Cocoa Touch == iPhone 开发

Cocoa == Mac OS X 开发


2
有点像C#和.NET。 - Gordon Gustafson
4个回答

41

你有一点错误。

NSTimer、NSString、NSMutableArray都是Cocoa框架的一部分。intfloat实际上是C语言的,但由于Objective-C是C语言的一个严格超集,所以你可以在Objective-C代码中使用它们。

纯Objective-C只需要链接Objective-C运行时库,不需要链接其他任何框架或库。Cocoa是一个包括NSObject和NSString等内容的框架。其他框架,比如AppKit,扩展了Cocoa框架。

在纯Objective-C中编码通常意味着从称为Object的根对象派生,而不是NSObject。像@implementation@interface@selector等内容是Objective-C对C语言的扩展,这些内容在所有Objective-C源代码中都很常见,无论是纯Objective-C还是其他类型的Objective-C源代码。如果你想要编写纯Objective-C代码,就不能使用除自己从Object派生出的对象之外的任何东西。

#import <objc/Object.h>

实际上,Objective-C并没有定义Object。它是由你使用的框架定义的。我不确定任何运行时库是否有一个定义好的Object。Cocoa的Object类就是NSObject。 - sebnow
11
sebnow说,Objective-C运行时库libobjc确实定义了一个Object类,它在<objc/Object.h>中声明。 - Peter Hosey
那似乎容易出故障,但我愿意纠正自己的看法 ;)。 - sebnow

9
正如已经指出的那样,NS*类实际上是Cocoa,而不是Objective-C。Objective-C是一种语言,而Cocoa是一个框架(OpenStep的实现)。这个框架可以被认为是C++的"stdlib"等效物。UI*类是Cocoa Touch,另一个为iPhone创建的框架。
至于最后一个问题,是的,Cocoa Touch只适用于iPhone。Cocoa适用于Mac OS X开发。然而,正如上面所述,Cocoa是一个OpenStep实现。存在替代Cocoa的选择,比如GNUstep和Cocotron。这些替代框架允许在多个平台上使用相同的代码。因此,OpenStep框架不仅适用于Mac OS X开发,也可以用于Linux和Windows。
另一个需要注意的事情是其他Objective-C运行时是不同的。没有单一的Objective-C规范。Portable Object Compiler是另一种方法。由于Apple是Objective-C的主要用户,并控制Cocoa,因此它被认为是事实上的Objective-C实现。

谢谢。从底部开始,层次结构是否像这样流动:C++ > Objective-C > Cocoa > Cocoa Touch? - 4thSpace
@4thspace:C++与此无关,这只是C语言。 - dreamlax
2
我不确定你的意思。Objective-C是C的超集,而Cocoa/Cocoa Touch是建立在Objective-C之上的框架。我认为它应该是C > Objective-C > Cocoa/Cocoa Touch。 - sebnow

2

虽然Cocoa Touch是用于iPhone开发的,而“普通”的Cocoa则是用于Mac OS X开发的,但它们并没有太大的区别,并且共享大部分基本类。

在 iPhone 开发中,您不需要关心是否使用纯Objective-C或Cocoa。Cocoa在iPhone上是一等公民,避免使用它并没有任何好处。

Objective-C和单纯的C子集之间存在轻微差异。对象分配和方法调用的开销比堆栈分配的结构和直接函数调用要高,但99%的时间内您也不需要关心这个问题(不要试图过早优化!)


1
关于iPhone开发,如何判断你是在使用Cocoa还是纯粹的Objective-C对象。
如果你的应用程序中只使用Objective-C,那么所有的Cocoa对象都是Objective-C对象。
如果你使用Python或Ruby,那么你的对象将是Python或Ruby对象。但只要它们继承自Cocoa类,无论它们是否是用Objective-C编写的,它们都可以被其他Cocoa对象访问。
(还有Core Foundation,它提供了在Cocoa中工作良好但不是用Objective-C编写的对象。这是一个实现细节,不用担心。)
例如,以下是Objective-C类:
- NSTimer - NSString - int, float - NSMutableArray
只有NSTimer、NSString和NSMutableArray是Objective-C类。int和float是原始类型,而不是类。它们都不是来自Objective-C:int和float来自C,而NS*类都来自Cocoa。
正如sebnow在我写这篇文章时所说,Cocoa是一个框架,而Objective-C是一种语言。NS*类都来自Cocoa框架,而不是Objective-C语言。
但这些是Cocoa: - UILabel - UIColor(?) - UIView
不,那些是Cocoa Touch。它们在Cocoa应用程序中不可用。同样,Application Kit类也不可在Cocoa Touch中使用。
(Cocoa是Foundation + AppKit;Cocoa Touch是Foundation + UIKit。)
并且要明确的是, Cocoa Touch == iPhone开发 Cocoa == Mac OS X开发
是的。Cocoa Touch是iPhone框架;Cocoa是Mac框架。

除了id、nil和self,Objective-C还有哪些类型? - 4thSpace
1
nil和self不是类型; nil是一个常量(实际上是宏),而self是一个隐含变量。还有一个关键字super。id是唯一的Objective-C特定类型。还有一些类型限定符。所有这些都列在Objective-C编程语言文档中。 - Peter Hosey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接