【问题标题】:always mandatory or sometimes optional?总是强制性的还是有时是可选的?
【发布时间】:2011-07-04 20:18:46
【问题描述】:

在阅读Objective-C 上的书时,我遇到了一个初始化类的示例,如下所示:

ClassName *p = [[ClassName alloc] init]; 

虽然首先我们需要分配内存来存储 ClassName 在初始化之前拥有的数据是有意义的,但以下方法也同样有效:

ClassName *p = [ClassName alloc]; 

是否总是需要init

【问题讨论】:

  • 有趣的是,在任何情况下不使用init 可能有用吗?

标签: objective-c init


【解决方案1】:

理论上,这在技术上不是必需的。那是因为NSObjectinit 方法实际上只是return self;。但是,在实践中,它绝对必不可少。对象在init 方法中执行内部设置——创建内部状态,分配私有成员,并且通常为行动做好准备。 init 方法甚至可能不会返回与您分配的对象相同的对象。

分两个阶段考虑:alloc 分配内存,但仅此而已 - 它类似于 Java 的 newinit 配置内存状态,以便对象可以执行它的任务 - 类似于 Java 调用构造函数。不要遗漏它!

【讨论】:

  • 酷。谢谢你解释这个
  • alloc 还执行设置isa 指针的重要步骤。
【解决方案2】:

好问题。你是对的。不需要严格地说“init”。 "alloc" 做了三个重要的事情来创建一个对象: - 分配足够的内存来保存所有实例变量 - 初始化“isa”实例变量 - 所有其他实例都设置为 0

考虑“根”Cocoa 对象 NSObject,在其 init 方法中简单地返回“self”。

但是,如果你想成为一个好的 Obj-C 公民,你必须使用“init”。它是您、开发人员和环境之间“合同”的一部分。

【讨论】:

    【解决方案3】:

    您应该始终调用其中一种初始化方法,尤其是当该类不是您自己的时。 init 返回的指针不一定与alloc 返回的指针相同。

    阅读文档:

    http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050-init

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-18
      • 2022-11-25
      • 2010-10-06
      • 2022-07-05
      • 2012-06-30
      • 2013-11-20
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多