我们知道在Objective-C中有两个主要的根类:NSObject
和NSProxy
。还有其他根(主要用于私有和遗留用途),如Object
和NSLeafProxy
。
定义新的根目录非常简单:
@interface DDRoot <NSObject>
@end
@implementation DDRoot
//implement the methods required by <NSObject>
@end
我的问题是:你为什么要定义一个新的根类?是否存在必要的用例?
答案 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 Reference的NSObject Protocol Reference,'Core Competencies: Root Class' document,Fundamentals 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