Objective c 子类中的超类方法放置
可能重复:Objective c 子类中的超类方法放置,objective-c,ios,inheritance,initialization,Objective C,Ios,Inheritance,Initialization,可能重复: 在调用超类方法(如[super viewDidLoad]或[super init]或[super viewDidUnload]时,是否存在差异/首选方式?我见过一些教程将它们放在子类方法的第一行或最后一行。我只是想知道是否会有任何依赖性,比如超级类方法是否会做一些设置,子类在前面调用时可以使用,或者超级类是否可以对子类在最后调用时所做的进行一些优化 您必须首先初始化super,因为super构造函数可以选择返回除原始值self之外的值 self = [super init]; 如
在调用超类方法(如
[super viewDidLoad]
或[super init]
或[super viewDidUnload]
时,是否存在差异/首选方式?我见过一些教程将它们放在子类方法的第一行或最后一行。我只是想知道是否会有任何依赖性,比如超级类方法是否会做一些设置,子类在前面调用时可以使用,或者超级类是否可以对子类在最后调用时所做的进行一些优化 您必须首先初始化super,因为super构造函数可以选择返回除原始值self
之外的值
self = [super init];
如果在调用[super init]
之前初始化了self
的其他属性,这些更改可能会被删除
那到底是干什么的
@Justin注意到类集群(在返回NSDictionary或NSString实例时使用)使用此机制根据任务提供稍微不同的子类。Singleton也可以使用它,Objective-C的(现在已弃用)Pose函数也可以使用。您必须首先初始化super,因为super构造函数可以选择返回除原始值
self
之外的值
self = [super init];
如果在调用[super init]
之前初始化了self
的其他属性,这些更改可能会被删除
那到底是干什么的
@Justin注意到类集群(在返回NSDictionary或NSString实例时使用)使用此机制根据任务提供稍微不同的子类。Singleton也可以使用它,Objective-C的Pose(现在已弃用)功能也可以使用。我的一般经验法则是,构造/创建行为首先调用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
- (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
-(id)init
{
self=[super init];//我的一般经验法则是,构造/创建行为首先调用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
- (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
-(id)init
{
self=[super init]我不知道这种情况在实践中是否真的发生过,但你必须遵守规则。确实发生过。类集群和单例是值得注意的例子。我想到了单例,然后我感到一阵寒意。在收到单例后初始化子类似乎不是一个好主意-原始的可能有e属于不同的子类,或者有运行数据。类群集-,这似乎是合理的。其中一些内容超出了我的想象,但感谢@justin和Alex Brown帮助我。正如justin在第一个答案中提到的,我现在对如何实现这一点有了更好的理解。我不知道在实践中是否会发生这种情况ce,但你必须遵守规则。确实会发生这种情况。类集群和单例是值得注意的例子。我想到了单例,然后一阵寒意袭来。在收到单例后初始化子类似乎不是一个好主意-原始的可能是另一个子类,或者有运行数据。类cluStres-,这似乎是合理的。有些事情超出了我的想象,但感谢@justin和Alex Brown帮助我。正如justin在第一个答案中提到的那样,我现在对如何实现这一点有了更好的理解。可能重复,可能重复,我刚刚介绍了init
,但你完全正确。我只是包含init
,但您完全正确。