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

Jam*_*sev 12 objective-c init

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

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

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

(id) initWithName:(NSString *) name
Run Code Online (Sandbox Code Playgroud)

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

tas*_*oor 12

init与Java/C++中的构造函数绝不相似.构造函数始终在创建对象时执行.但执行权init取决于你.如果init之后没有发送消息alloc则不会执行.

// init does not execute here
MyObject *obj = [MyObject alloc];
Run Code Online (Sandbox Code Playgroud)

这将没有任何问题的工作,如果你得到NSObject,因为initNSObject什么都不做.

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

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

  • 是的,即使NSObject的init没有初始化,你也应该这样做.这是一个很好的做法,当你调用它时没有问题.对于大多数其他类,需要调用超类初始化.所以总结是:始终调用基类的初始化方法. (2认同)