【问题标题】:Calling init in init, before self = [super init]在 init 中调用 init,在 self = [super init] 之前
【发布时间】:2015-05-27 13:19:28
【问题描述】:

self = [super init]; 是一种常见的初始化模式。应该分配自指针

但是我可以这样转发初始化吗?

- (id)initWithObject:(id)object {
    return [self initWithObject:object scrollTo:nil];
}

代码有效,但不确定它是否是 Kosher ......以及没有 self = [super init] 的情况下它如何工作

再往前走,这样可以吗?

- (id)initWithObject:(id)object {
    self = [self initWithObject:object scrollTo:nil]; // NOT super
    if (self) {
       //...
    }
    return self;
}

【问题讨论】:

  • 100% 合法。当我有多个重载的构造函数时,我经常这样做
  • 是的,但你应该真正开始使用instancetype 而不是id

标签: objective-c cocoa cocoa-touch


【解决方案1】:

是的,这很好。我自己做过几次都没有问题,我在Apple documentation 中找到了一个代码示例(向下滚动到“Multiple Initializers and the Designated Initializer”)。

【讨论】:

  • 但是self指针怎么可能被访问,我们为什么要这样做self = [super init]
  • self 已经定义,因为您已经调用了[Class alloc]
  • 那么为什么约定那么 self = [super init ... ]
  • 使用alloc,您只需为对象分配内存。您仍然必须初始化它 - 例如在NSObjectinit方法中可以找到一些所有对象共有的初始化代码。
  • 但是不调用 NSObjetcs init 意味着什么,因为你可以调用方法,即使没有初始化
【解决方案2】:

只有在返回运算符中调用指定的初始化程序或调用该初始化程序的初始化程序时,它才是绝对合法的。确保以一种或另一种方式调用指定的初始化程序。

【讨论】:

    【解决方案3】:

    是的,当然可以!注意 initWithObject:scrollTo 必须返回一个有效的 self 对象。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多