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

Objective c 目标C:应该在.h中声明init方法吗?,objective-c,init,Objective C,Init,首先,据我所知,Objective-C中的init在功能上类似于Java中的构造函数,因为它用于初始化实例变量和准备类来做一些工作。这是正确的吗 我知道NSObject实现了init,因此它不需要在任何.h文件中声明 但是对于给定的类,init的自定义实现如何,例如: (id) initWithName:(NSString *) name 像这样的声明应该作为.h的一部分列出,还是不需要?它是按约定完成的还是有其他原因?是的,如果您想调用此个性化初始化方法(initWithName),则必须声

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

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

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

(id) initWithName:(NSString *) name

像这样的声明应该作为
.h
的一部分列出,还是不需要?它是按约定完成的还是有其他原因?

是的,如果您想调用此个性化初始化方法(
initWithName
),则必须声明它。在该方法中,您首先要做的是调用
[super init]

init
与Java/C++中的构造函数完全不同。构造函数总是在创建对象时执行。但是
init
的执行取决于您。如果在
alloc
之后不发送
init
消息,则它将不会执行

// init does not execute here
MyObject *obj = [MyObject alloc];
如果您从
NSObject
派生,这将不会有任何问题,因为
NSObject
init
什么都不做

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


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

最好说初始值设定项应该调用其超类的指定初始值设定项。指定的初始值设定项不一定是
-init
,在调用指定的初始值设定项之前,您可以自由执行其他工作。您不必声明它。它仍然可以在没有声明的情况下调用,但是当您尝试从其他类使用它时,会收到编译器警告。谢谢。如果我使用自定义init方法初始化类,是否意味着我应该始终[super init]以确保至少调用一次NSObjet的init?是的,即使NSObject的init没有初始化,您也应该始终这样做。这是一个很好的实践,当你调用它时没有问题。对于大多数其他类,调用超级类初始化是必需的。所以总结是:总是调用基类的初始化方法。我不知道为什么我在这里得到了否决票。一句解释我的错误的评论会对我有所帮助。