NSObject 中 - (id)init 的用途是什么

what is the use of - (id)init in NSObject

今天我浏览了一些在线代码,发现了一些 NSObject Class。

有些人有:

- (id)init
 {  
      self = [super init];

      return self;
 
 }

有些没有。

然后我也在我的示例代码中尝试了这个。我完全糊涂了。在此之前我在想我们必须写-(id)init方法来实例化一个NSObjectClass。但现在没有它也能正常工作。

以下是我的一些疑惑:

  1. is -(id)init method really necessary?

  2. What happens if we don't use it.

  3. If we don't write init method even then my code works. Why?

空着-init完全没有作用。

NSObject 已经有 -init 方法。 Objective-C中的方法是继承的。

这与覆盖任何其他方法一样,只需调用 super:

- (void)someMethod {
    [super someMethod];
}

不调用 super init 是错误的,结果未定义。 (我遇到了坏事)

-init() 是 NSObject 的初始化器。如果用户创建一个继承 NSObject 的 Person Class。它可以覆盖这个初始化器,或者可以创建自己的自定义初始化器,如下所示 例如

    class Person : NSObject
    {
        let name:String
        //Initializer inherited from NSObject
        override init()
        {
           super.init()
        }
        //Custom Initializer
        init(withName name:String)
        {
           super.init()
           self.name = name
        }

    }

您将在 Apple documentation 关于初始化器的文章中找到问题的答案。我建议您仔细阅读这些材料,它们会澄清很多事情。

关于您的问题的文档总结:

is -(id)init method really necessary?

如果在实例化 class 时不需要执行额外的逻辑,则不需要在 class.[=17 中实现 init =]

What happens if we don't use it.

即使您不需要在子class中实现它,您也需要在创建新对象时调用它,例如[[MyClass alloc] init]

If we don't write init method even then my code works. Why?

正如我上面所写,您不需要为您的 class 声明一个,但您需要调用它。否则您的代码可能无法正常工作。

强烈建议使用

[super init],这样超级 class 就有机会正确配置新创建的对象。