iOS - 为什么init必需和其他初始化问题

时间:2012-04-07 15:28:08

标签: ios

Objective C规范(来自Apple)第49页指出 声明实例变量的每个类必须提供初始化它们的init方法

我的问题 - 为什么这有必要? NSObject是否为实例初始化iVar?

应该将init视为构造函数。

init必须被称为init吗?我可不可以做 id anObject = [[SomeClass alloc] foo ];

Muchas gracias。

4 个答案:

答案 0 :(得分:0)

init方法类似于构造函数,但它不会自动调用。你必须自己打电话。

将其称为“init”是一种常见的约定,但不是必需的。

答案 1 :(得分:0)

init的默认NSObject不会触及实例变量。 spec中的语句意味着如果您使用NSString *strNSDate *d对象之类的东西作为类的实例变量,则您负责初始化它。这通常发生在init,但您可以在其他方法中初始化它们。

是的,您可以让[[SomeClass alloc] foo]返回一个对象。

答案 2 :(得分:0)

类通常不知道它们的子类的内部结构,NSObject也没有那么不同。

alloc + init非常类似于构造函数,但链接不是自动的。

它不必被称为init,但以init开头几乎是普遍的。 E.g:

- (id)initWithString:(NSString *)string {
    self = [super init];
    if (self) {
        self.myString = string;
    }
    return self;
}

答案 3 :(得分:0)

首先没有必要。init用于初始化实例变量的属性。当你使用自己的班级时,你不会唤起初始化。在我看来,alloc等于constructor。通过一个非常简单的例子,我告诉了原因。当我们想要的时候使用单例模式,用constructor很容易在java或其他编程语言中进行补充。对象c中的对象C或IOS也很容易,尽管没有明显的构造函数。在Apple的#s官方的例子,你会发现他们只是重写了NSObject中的allocWithZone,而alloc会最终唤起它。所以我认为alloc是Object C中的构造函数。但是我认为你是这样的更好地使用init.It是约定或标准。因此本书使用单词must。无论编程语言初始化必须做什么。只是Apple明确地强调它