【问题标题】:Does the timing of calling the method of the super class matter in ObjectiveC?在Objective C中调用超类方法的时间是否重要?
【发布时间】:2009-06-17 05:04:35
【问题描述】:

我是先调用超类的方法还是最后调用超类的方法有关系吗?例如

-(void)didReceiveMemoryWarning {
   /* do a bunch of stuff */

   [super didReceiveMemoryWarning];
}

-(void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];

   /* do a bunch of stuff */
}

对于 viewWillAppear、willRotateToInterfaceOrientation 等其他方法也有同样的问题。

我正在寻找有意义的差异,而不仅仅是风格或哲学上的差异(尽管也欢迎这些差异)。

【问题讨论】:

    标签: ios objective-c iphone oop cocoa-touch


    【解决方案1】:

    典型的 Cocoa 约定:

    1. 如果您正在执行设置,请调用 超级第一
    2. 如果您正在执行 拆解,调用 super LAST

    因此,初始化、viewDidLoad 等属于第一种情况。内存警告、viewDidUnload 和 dealloc 属于第二种情况。

    你还应该设计你的类来遵循这个约定。如有偏差,应特别注明。

    相关的答案:

    `[super viewDidLoad]` convention


    添加: 在设置过程中首先调用 super 的基本原理是,您希望在扩展功能之前确保一切就绪。推论是,当您解除分配时,您不希望您的子类所依赖的任何超类 ivars 在您有机会处理它们之前被解除分配。

    这在参考 UI 更新以及在下面的 cmets 中指出时是有意义的。

    【讨论】:

    • 你会如何在评估中对 willRotateToInterfaceOrientation 进行分类?
    • 在我看来,我会说它是设置。我认为你希望超类执行它的对象(很可能包括根视图对象)的旋转,然后你会想要在发生之后处理你的(最有可能是子视图)。
    【解决方案2】:

    这取决于功能,你要么想在超类完成它的事情之后或之前做一些事情。

    例如,如果超类包含一些 UI 元素,而您扩展它,您的类将包含更多 UI 元素。要获得适合整个对象的大小,您可能会调用超类来计算其元素的大小,然后将您添加的元素的大小添加到该大小。

    否则就没有意义了——超类不知道你的元素,所以它会覆盖你的计算。同样,这取决于实施。

    有一种特殊情况,你需要调用超级方法作为最后一件事:

    -(void)dealloc
    {
        ...
        [super dealloc];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多