在Objective C中调用超类方法的时间是不是重要?

Posted

技术标签:

【中文标题】在Objective C中调用超类方法的时间是不是重要?【英文标题】: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 等其他方法也有同样的问题。

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

【问题讨论】:

【参考方案1】:

典型的 Cocoa 约定:

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

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

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

相关的答案:

`[super viewDidLoad]` convention


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

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

【讨论】:

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

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

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

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

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

-(void)dealloc

    ...
    [super dealloc];

【讨论】:

以上是关于在Objective C中调用超类方法的时间是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

Objective C 查看方法被调用次数的最佳方法

c_cpp 在编译时禁止使用默认的Objective-C -init方法(并提供一个其他超类方法的示例,您可以使用它

调用超超类方法

Objective-C中如何创建构造函数呢?

如何在多重继承中调用超类方法?

我可以使用 OCMock 测试是不是调用了超类吗?