首先,据我所知,Objective-C
中的init在功能上类似于Java
中的构造函数,因为它用于初始化实例变量并准备一个类来完成一些工作。这是对的吗?
我理解NSObject
实现了init
,因此不需要在任何.h
文件中声明它。
但是如何为给定的类自定义init的实现,例如:
(id) initWithName:(NSString *) name
这样的声明应该作为.h
的一部分列出,还是没有必要?它是按惯例完成还是有其他推理?
答案 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];
。