在调用超级类方法(例如[super viewDidLoad]
或[super init]
或[super viewDidUnload]
时,是否存在差异/首选方式?我已经看过教程将它们放在第一行或作为子类方法的最后一行。我只是想知道是否会有任何依赖性,如果超类方法会做一些设置,孩子可以使用当被调用前面时,或者如果超级可以对孩子做过的事情进行一些优化最后调用时。
答案 0 :(得分:4)
我的一般经验法则是构造/创建行为首先通过super
调用,而破坏或拆除状态的行为则以相反的顺序发生 - super
最后调用。很少需要偏离它。
原因通常不是优化(如您的帖子中所述),而是可预测的语义。
示例A:
构造
- (id)init
{
self = [super init]; // << set up super
if (0 != self) {
// set up self
...
破坏:
- (void)dealloc
{
[ivar release], ivar = 0; // << tear down self
[super dealloc]; // << tear down super
例B:
构造
- (void)viewWillAppear:(BOOL)pAnimated
{
[super viewWillAppear:pAnimated]; // << call through super first
// now set up self
...
破坏:
- (void)viewDidDisappear:(BOOL)pAnimated
{
// tear down self
[super viewDidDisappear:pAnimated]; // << now tear down super
答案 1 :(得分:0)
您必须首先初始化超级 ,因为超级构造函数可以选择返回self
原始值以外的值。
self = [super init];
如果在致电self
之前初始化[super init]
的其他属性,则可能会删除这些更改。
究竟是为了什么?
@Justin注意到Class Clusters(在返回NSDictionary或NSString的实例时使用)使用此机制根据任务提供稍微不同的子类。单身人士也可以使用它,而Objective-C的(现已弃用)Pose
功能也可以使用。