【问题标题】:Why is Class delegation so enigmatic?为什么类委托如此神秘?
【发布时间】:2011-04-24 05:14:39
【问题描述】:

这可能是另一个粗俗的新手问题,会让每个人都拍着额头说“Duhhhhhh!”但是,在又长时间阅读和观看了无数 Brad Larson 视频之后,我对为什么总体上的委托,特别是 CALayer 委托似乎是一个如此神秘的主题感到困惑。

所有书籍和 Larson 博士都在谈论“不要对 CALayer 进行子类化”,除非您想要高度封装,但我在任何地方都找不到 CALayer 委托可以提供的好处的简洁明了的例子。每个人似乎都将主机视图控制器对象用作某种敷衍的委托,或者他们将所有内容都放入 App 委托中“作为可以实现的简短示例”。

我正在尝试预先学习“最佳实践”——因为我是新手,而且我不想发展任何糟糕或邋遢的编程特征——所以我热衷于检查我的每一个新步骤细细品味。据我所知,一个 CALayer 委托类中只有大约 3 个委托特定的方法。它们是“displayLayer:”、“drawLayer:InContext:”和“actionForLayer:ForKey:”。在我的 Opacity 生成的 Quartz 东西中,我使用了我想在运行时操作的颜色变量,并且在没有子类化 CALayer 的情况下这样做。使用键值对的副作用之一是存在一个名为“defaultValueForKey:”的类方法,它根据用于识别颜色的键值来描述我的颜色的初始值。这(显然)不是 CALayer 委托方法。那么如何在没有子类化CALayer的情况下实现这段代码(之后,所有代码都只设置一个默认值)?只要您只需要少数特定于委托的方法,委托似乎就可以了。

谁能解释为什么在实现委托时,Apple 的研究人员没有简单地将方法定义编译单元从类单元转移到分配的委托单元。例如只需在类(或子类)中通常可用的每个方法前面放置一个初始参数即可; 'forLayer:(CALayer *)TheRest:OfThe:方法'?这样,一个简单的开关或 if-then 堆栈就可以在一个集中的对象(委托)中应用类的常用方法。

正如我在开头所说的,我可能遗漏了一些非常基本的东西,但谁能告诉我如何在没有子类化 CALayer 的情况下实现所有键值颜色变量初始化?

提前致谢, V.V.

【问题讨论】:

    标签: delegates calayer delegation


    【解决方案1】:

    你想多了。正如您所提到的,您是该平台的新手。 Cocoa 中有很多成语,其中一个成语有点像 Perl:“有不止一种方法可以做到这一点”。

    Cocoa 有委托的历史,因为很多时候,您只需要一两个方法,而谁想要使用很少方法的无数类的复杂性。代表可以让您以简单的方式解决这个问题。

    因此,基本上,与其从整体工程的角度分析所有内容,不如使用该平台。写一些代码。以“错误的方式”编写一些代码。写很多吧。

    为什么?因为如果是“错误的方式”,你自己会感觉到的。您将在维护或其他任何事情中开始诅咒它,然后您将找出“正确的方法”。什么是“正确的方法”?让您感觉更好的方式。

    这些决定中的大多数对性能等的影响都很小,所以不用担心。因此,您选择哪种技术并不重要。

    编写代码。写很多吧。你写得越多,你就越能感觉到什么时候是正确的,什么时候是错误的。或者当之前的正确方式变成错误的方式并且应该重构为新的正确方式时。

    因为现在的对与错可能不会在以后发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2011-12-15
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多