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

Dav*_*ong 11 theory cocoa objective-c

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

定义一个新根是相当简单的:

@interface DDRoot <NSObject>

@end

@implementation DDRoot

//implement the methods required by <NSObject>

@end
Run Code Online (Sandbox Code Playgroud)

我的问题是:你为什么要定义一个新的根类?是否有必要使用某些用例?

bbu*_*bum 12

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

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

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

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

关键,但是,是,如果你走这条路线,你不要试图让你的班,基金会/ CF/AppKit的/ UIKit的互动等,如果你需要的是,只要继承NSObject的了!

值得注意的是NSManagedObject,它实际上是一个根类,因为它做了一些非常认真的自定义内容,但是它是子类的NSObject子类,NSManagedObject可以与系统的其余部分互操作.


Ita*_*ber 8

据我所知,应该没有理由创建自己的根类,因为如果你自己实现所有的NSObject协议方法,你就会错过很多功能,并且会创建一个很多对Objective-C运行时的调用本质上应该为你完成.

除非你真的不得不从默认执行不同的协议(NSProxy是一种特殊情况确实需要),你不应该需要使自己的根类.我的意思是,你必须编写一个不能从根本上代表的类NSObject和Apple实现的协议,在这种情况下,为什么你甚至用Objective-C编写它?

那就是我所想的.也许有人可以为它创造性地使用它.

(研究该主题的人应该查看NSObject类参考,NSObject协议参考,'核心能力:根类'文档,以及" 基础指南:可可对象"文档中的"根类"部分.)


Jen*_*ton 5

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

另一个用途是制作一个比迈克NSProxy·阿什在这里做的更小的代理.

哦,私有NSInvocationBuilder是一个root类,大概和Mike的代理一样.捕获调用以供以后使用是人们可能想要重新创建的内容.