Objective C规范(来自Apple)第49页指出 声明实例变量的每个类必须提供初始化它们的init方法
我的问题 - 为什么这有必要? NSObject是否为实例初始化iVar?
应该将init视为构造函数。
init必须被称为init吗?我可不可以做 id anObject = [[SomeClass alloc] foo ];
Muchas gracias。
答案 0 :(得分:0)
init方法类似于构造函数,但它不会自动调用。你必须自己打电话。
将其称为“init”是一种常见的约定,但不是必需的。
答案 1 :(得分:0)
init
的默认NSObject
不会触及实例变量。 spec中的语句意味着如果您使用NSString *str
或NSDate *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明确地强调它