【问题标题】:Cocoa or Objective-C?可可还是Objective-C?
【发布时间】:2009-03-15 05:46:20
【问题描述】:

关于 iPhone 开发,您现在如何使用 Cocoa 与纯 Objective-C 对象。比如下面是Objective-C

  • NSTimer
  • NSString
  • 整数,浮点数
  • NSMutableArray

但这些是可可:

  • UILabel
  • UIColor(?)
  • UI 视图

要明确的是,是的

Cocoa Touch == iPhone 开发

Cocoa == Mac OS X 开发

【问题讨论】:

  • 有点像 C# 和 .net

标签: objective-c iphone cocoa cocoa-touch


【解决方案1】:

你搞错了。

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 编写代码,除了你自己的从 Object 派生的对象之外,你不能使用任何东西。

#import <objc/Object.h>

【讨论】:

  • 其实Objective-C没有定义Object。它由您使用的框架定义。我不确定是否有任何运行时库定义了对象。 Cocoa 的 Object 类 NSObject.
  • sebnow:libobjc,Objective-C 运行时库,确实定义了一个 Object 类。它在 中声明。
  • 这似乎很容易损坏,但我的立场是正确的;)。
【解决方案2】:

正如已经指出的,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:C++ 和它无关,它只是 C。
  • 我不确定你的意思。 Objective-C 是 C 的超集,而 Cocoa/Cocoa Touch 是 Objective-C 之上的框架。我想它是 C > Objective-C > Cocoa/Cocoa Touch。
【解决方案3】:

确实,Cocoa Touch 是用于 iPhone 开发的,而“普通”Cocoa 是用于 Mac OS X 开发的,但它们并没有太大的不同,并且共享大部分基本类。

在 iPhone 开发中,您无需关心您使用的是纯 Objective-C 还是 Cocoa。 Cocoa 是 iPhone 上的一等公民,避免它不会获得任何好处。

Objective-C 和普通的旧 C 子集之间存在细微差别。对象分配和方法调用比堆栈分配结构和直接函数调用具有更高的开销,但 99% 的时间您也不需要关心这一点(不要尝试过早优化!)。

【讨论】:

    【解决方案4】:

    关于 iPhone 开发,您现在如何使用 Cocoa 与纯 Objective-C 对象。

    如果您的应用程序中除了 Objective-C 之外没有使用任何东西,那么所有 Cocoa 对象都是 Objective-C 对象。

    如果您使用的是 Python 或 Ruby,那么您的对象将是 Python 或 Ruby 对象。但只要它们继承自 Cocoa 类,它们就可以被其他 Cocoa 对象访问,无论它们是否是用 Objective-C 编写的。

    (有 Core Foundation,它提供了在 Cocoa 中可以正常工作但不是用 Objective-C 编写的对象。这是一个实现细节;不用担心。)

    例如,以下是Objective-C:

    • NSTimer
    • NSString
    • 整数,浮点数
    • NSMutableArray

    只有 NSTimer、NSString 和 NSMutableArray 是 Objective-C 类。 int 和 float 是原始类型,而不是类。而且它们都不是来自Objective-C:int和float来自C,NS*类都来自Cocoa。

    正如我在写这篇文章时 sebnow 所写的,Cocoa 是一种框架,而 Objective-C 是一种语言。 NS* 类都来自 Cocoa 框架,而不是 Objective-C 语言。

    但这些是可可:

    • UILabel
    • UIColor(?)
    • UI 视图

    不,那些是 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类型?
    • nil 和 self 不是类型; nil 是一个常量(实际上是宏),而 self 是一个隐式变量。还有super,这是一个关键字。 id 是唯一特定于 Objective-C 的类型。还有一些类型限定符。所有这些都列在 Objective-C 编程语言文档中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多