Objective-C:应该在.h中声明init方法吗?

时间:2011-07-19 15:20:33

标签: objective-c init

首先,据我所知,Objective-C中的init在功能上类似于Java中的构造函数,因为它用于初始化实例变量并准备一个类来完成一些工作。这是对的吗?

我理解NSObject实现了init,因此不需要在任何.h文件中声明它。

但是如何为给定的类自定义init的实现,例如:

(id) initWithName:(NSString *) name

这样的声明应该作为.h的一部分列出,还是没有必要?它是按惯例完成还是有其他推理?

2 个答案:

答案 0 :(得分:12)

init与Java / C ++中的构造函数类似。构造函数始终在创建对象时执行。但是init的执行取决于你。如果您在init之后没有发送alloc消息,则它将不会执行。

// init does not execute here
MyObject *obj = [MyObject alloc];

如果您从NSObject派生,这将毫无问题地工作,因为init的{​​{1}}什么都不做。

您不需要在头文件中添加NSObject,因为它是从init继承的,但您需要将自定义init方法(未继承)添加到头文件中。请注意,NSObject方法只是具有命名约定的常规方法,但从技术上讲,与其他方法没有区别。

如果未在头文件中指定自定义init方法,但将该消息发送到对象,则编译器将生成警告。不会有编译错误。因此,如果您决定忽略该警告,那么您也可以从标题中省略该警告。但是如果实际上没有实现该方法,则会导致运行时崩溃。因此,最好添加未在头文件中继承的所有方法。

答案 1 :(得分:0)

是的,如果您希望能够调用此个性化初始化方法(initWithName),则必须声明它。首先想到你必须要做的就是调用[super init];