【问题标题】:When wouldn't NSObject be stated as the parent class?什么时候不将 NSObject 声明为父类?
【发布时间】:2009-07-01 00:24:06
【问题描述】:

例如:

@interface Fraction: NSObject {
...

什么时候不使用NSObjectNSObject 是所有其他类的最终父类?

请随时纠正我使用的任何错误术语。

【问题讨论】:

标签: objective-c class nsobject


【解决方案1】:

在任何 Cocoa 应用程序中,如果您检查运行时类树,您会发现五个根类:NSObject、Object、NSProxy、NSMessageBuilder 和 NSZombie

您应用程序中的大多数普通对象都将继承自 NSObject。 Object 是 Objective-C 早期的原始根类,在 NeXT 开发 Enterprise Objects Framework 时被 NSObject 取代。

NSMessageBuilder 被运行时用于消息转发。 NSProxy 被分布式对象实现用于处理编组消息以发送到其他进程甚至其他主机上的对象。 NSZombie 是一个用于调试内存泄漏的类。

【讨论】:

    【解决方案2】:

    Cocoa 有两个根类:NSObject 和 NSProxy。

    NSObject 是几乎所有 Cocoa 对象的根类。

    NSProxy 是一个抽象超类,它为充当其他对象或尚不存在的对象的替代对象定义了一个 API,并且是 NSDistantObject 等类的根类。

    这两个类都实现了 NSObject 协议。

    也可以编写自己的没有根类的 Objective C 类,但你可能永远不会这样做,并且除非你还实现了NSObject 协议,即使那样它的用途也很可疑。

    【讨论】:

    • 正确。与 Java 不同,Object 是默认的父对象,在 Objective-C 中,如果您不声明父类,您就不会得到一个。实际上,您的类成为根类,并且您获得零继承行为。这几乎不是你想要的,并且会导致各种奇怪的编译器警告。
    • @Quinn,虽然可以这样做,但它涉及直接调用 Objective-C 运行时函数,以便正确分配实例和寄存器位和片段。我曾经做过一次实验,但在放弃之前离 NSObject 的功能还差得很远。
    • 根类,不是根对象。 Objective-C 不是基于原型的 OO 环境。
    【解决方案3】:

    如果我写的是 NSView 的子类,我会写:

    @interface Fraction: NSView {...
    

    因为我的类继承自 NSView。 Objective-C 中的类仅继承自一个父类。当您从 NSView(到其父类 NSResponder)沿链向上工作时,您会发现它最终继承自 NSObject。

    我不确定您问题的第二部分。我认为 Apple 的 Cocoa 框架中的所有类最终都继承自 NSObject,但不要引用我的话。在 Objective-C 中,没有理由不能有其他根对象(否则 Objective-C 只能在 Apple 系统上使用)。但是,在 Cocoa 中,NSObject 是根。

    【讨论】:

    • 有一些没有,比如 NSProxy 和 Objective-C 类(Protocol、Class)
    • Class 在 Objective-C 中不是一个类——它是一个类似于 id 的数据类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2012-04-26
    • 2019-05-11
    相关资源
    最近更新 更多