总是强制的或有时可选的?

时间:2011-07-04 20:18:47

标签: objective-c init

当我在Objective-C上阅读这本书时,我遇到了一个初始化课程的例子如下:

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

虽然首先我们需要在初始化之前分配内存以存储数据ClassName,但以下情况也同样有效:

ClassName *p = [ClassName alloc]; 

总是需要init吗?

3 个答案:

答案 0 :(得分:3)

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

分两个阶段考虑:init分配内存,但就是这样 - 它类似于Java的allocnew配置内存的状态,以便对象可以执行它的任务 - 类似于Java调用构造函数。不要把它留下来!

答案 1 :(得分:3)

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

考虑“root”Cocoa对象NSObject只是在其init方法中返回“self”。

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

答案 2 :(得分:1)

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

阅读文档:

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