当我在Objective-C
上阅读这本书时,我遇到了一个初始化课程的例子如下:
ClassName *p = [[ClassName alloc] init];
虽然首先我们需要在初始化之前分配内存以存储数据ClassName
,但以下情况也同样有效:
ClassName *p = [ClassName alloc];
总是需要init
吗?
答案 0 :(得分:3)
从理论上讲,这不是技术上的要求。这是因为NSObject
的{{1}}方法实际上只是init
。但是,在实践中,绝对必不可少。对象在return self;
方法内执行内部设置 - 创建内部状态,分配私有成员,并且通常为行动做好准备。 init
方法甚至可能不会返回与您分配的对象相同的对象。
分两个阶段考虑:init
分配内存,但就是这样 - 它类似于Java的alloc
。 new
配置内存的状态,以便对象可以执行它的任务 - 类似于Java调用构造函数。不要把它留下来!
答案 1 :(得分:3)
好问题。而你是对的。严格来说,不需要“初始化”。 “alloc”创建一个对象有三个重要的事情: - 分配足够的内存来容纳所有实例变量 - 初始化“isa”实例变量 - 所有其他实例都设置为0
考虑“root”Cocoa对象NSObject只是在其init方法中返回“self”。
但是,如果你想成为一名优秀的Obj-C公民,你必须使用“init”。它是您,开发人员和环境之间“合同”的一部分。
答案 2 :(得分:1)
您应该始终调用其中一个初始化方法,尤其是当该类不是您自己的类时。从init
返回的指针不一定与alloc
返回的指针相同。
阅读文档: