有什么用例来定义新的根类?

时间:2010-11-28 04:10:00

标签: objective-c cocoa theory

我们知道在Objective-C中有两个主要的根类:NSObjectNSProxy。还有其他根(主要用于私有和遗留用途),如ObjectNSLeafProxy

定义新的根目录非常简单:

@interface DDRoot <NSObject>

@end

@implementation DDRoot

//implement the methods required by <NSObject>

@end

我的问题是:你为什么要定义一个新的根类?是否存在必要的用例?

4 个答案:

答案 0 :(得分:12)

创建新的根类有两个主要原因;代理和一个新的对象模型。

在代理时,实现新的根类可能很有用,这样您基本上可以自定义方式处理任何和所有类/对象的行为。见NSProxy。

Objective-C运行时非常灵活,您可以非常轻松地支持新的对象模型(其中轻松可以降低创建此类野兽的固有复杂性)。实际上,许多被认为是运行时固有的行为--KVC,KVO等 - 都是作为NSObject类本身的一部分实现的。

我知道至少有一家公司 - 至少在大约8年前 - 已经实施了自己的对象模型,作为构建~500k LOC财务分析引擎的一部分。

关键是,如果你走这条路,你尝试让你的课与Foundation / CF / AppKit / UIKit等互动。如果你需要 ,只是NSObject的子类!

有趣的是,NSManagedObject实际上是一个根类,因为它做了一些非常认真的自定义内容,但它是NSObject的子类,因此NSManagedObject的子类是inter - 可与系统的其他部分一起使用。

答案 1 :(得分:8)

据我所知,没有理由创建自己的根类,因为没有自己实现所有NSObject协议方法,你将会错过很多功能,并将对Objective-C运行时进行大量调用,基本上应该为您完成。

除非你真的必须以不同于默认值的方式实现协议(NSProxy 必须的特殊情况),否则你不需要创建自己的根类。我的意思是,你必须编写一个不能从根本上代表NSObject的类和Apple实现的协议,在这种情况下,你为什么要写它目标C?

这就是我的想法。也许有人可以为它创造性地使用它。

(研究该主题的人应该查看NSObject Class ReferenceNSObject Protocol Reference'Core Competencies: Root Class' documentFundamentals Guide: Cocoa Objects document和“根类”部分。)

答案 2 :(得分:5)

Objective-C和Cocoa是分开的东西,原则上可以定义不使用Foundation的全新应用程序框架。人们提到的财务分析是一个实际的例子,我相信它们仍然存在。

另一个用途是制作一个比NSProxy更小的代理,正如Mike Ash所做的here

哦,私有NSInvocationBuilder是一个根类,可能与Mike的代理原因相同。捕获调用以供以后使用是人们可能想要重新创建的内容。

答案 3 :(得分:1)

像OmniGroup这样的公司已经定义了一个NSObject版本,可以作为自己的基类用于所有事情。

它本质上是NSObject的子类,带有一些调试内容。除此之外,打击框架通常是一个糟糕的主意。

在此处查找Omni的代码: https://github.com/omnigroup/OmniGroup