在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中调用超类方法的时间是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章