Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 子类中的超类方法放置_Objective C_Ios_Inheritance_Initialization - Fatal编程技术网

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
,但您完全正确。