代码之家  ›  专栏  ›  技术社区  ›  Dave DeLong

有哪些用例用于定义新的根类?

  •  11
  • Dave DeLong  · 技术社区  · 14 年前

    我们知道在Objective-C中有两个主要的根类: NSObject NSProxy . 还有其他的根源(主要是为了私人和遗产目的)比如 Object ,和 NSLeafProxy .

    定义一个新根相当简单:

    @interface DDRoot <NSObject>
    
    @end
    
    @implementation DDRoot
    
    //implement the methods required by <NSObject>
    
    @end
    

    我的问题是:为什么要定义一个新的根类?有必要的用例吗?

    4 回复  |  直到 11 年前
        1
  •  8
  •   Felixyz    14 年前

    据我所知,应该没有理由创建自己的根类,因为除了实现 NSObject protocol方法本身,您将丢失许多功能,并将对Objective-C运行时进行大量调用,这些调用本质上应该为您完成。

    除非你真的必须实现与默认协议不同的协议( NSProxy 是一种特殊情况 必须),您不应该创建自己的根类。我是说,你必须写一个不能 从根本上 NSObject对象 以及由苹果公司实现的协议,在这种情况下,为什么还要用Objective-C编写呢?

    我就是这么想的。也许有人能想出一个有创意的方法。

    (研究这个话题的人应该去看看 NSObject Class Reference , NSObject Protocol Reference , 'Core Competencies: Root Class' document ,以及 Fundamentals Guide: Cocoa Objects document .)

        2
  •  12
  •   Felixyz    14 年前

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

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

    ObjyE-C运行时足够灵活,可以很容易地支持新的对象模型(在哪里) 容易地 打折创造这种野兽的内在复杂性。实际上,许多被认为是运行时固有的行为——KVC、KVO等。。--作为 NSObject 类本身。

    我知道至少有一家公司——至少在大约8年前——已经实现了他们自己的对象模型,作为构建其约50万LOC财务分析引擎的一部分。

    但关键是,如果你走这条路,你 不要 如果需要,尝试使您的类与Foundation/CF/AppKit/UIKit等交互 那个 ,只是NSObject的子类已经存在!

    有趣的是注意到 NSManagedObject 实际上是一个根类,它做一些非常严肃的定制工作,但是它是 NSObject对象 所以 被管理对象 与系统其他部分互操作。

        3
  •  5
  •   Jens Ayton    14 年前

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

    另一个用途是生成一个比 NSProxy 就像迈克·阿什一样 here .

    哦,还有私人 NSInvocationBuilder 是根类,可能与Mikes proxy的原因相同。捕获调用以供以后使用是需要重新创建的。

        4
  •  1
  •   Dexter    14 年前

    像OmniGroup这样的公司已经定义了NSObject的一个版本,作为它们自己的基类来使用。

    它本质上是NSObject的一个子类,包含一些调试内容。除此之外,与框架抗争通常是个糟糕的主意。

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