在NSObject

时间:2016-01-10 12:29:53

标签: ios objective-c object nsobject

今天我正在阅读一些在线代码,我发现了一些NSObject类。

有些人有:

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

      return self;

 }

有些人没有。

然后我也在我的示例代码中尝试了这个。我完全糊涂了。在此之前,我认为我们必须编写-(id)init方法来实例化NSObject类。但是现在它没有了。

以下是我的一些疑问:

  
      
  1. 是 - (id)init方法真的有必要吗?

  2.   
  3. 如果我们不使用它会发生什么。

  4.   
  5. 如果我们不写init方法,那么我的代码就可以了。为什么呢?

  6.   

4 个答案:

答案 0 :(得分:3)

-init完全没有功能。

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

它与覆盖任何其他方法相同,只需调用super:

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

答案 1 :(得分:2)

您可以在Apple documentation初始值设定项中找到问题的答案。我建议你仔细阅读这些材料,他们会澄清很多东西。

总结有关您问题的文档:

  

是 - (id)init方法真的有必要吗?

如果您在课程实例化时不需要执行额外的逻辑,那么您不需要在班级中实施init

  

如果我们不使用它会发生什么。

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

  

如果我们不写init方法,那么我的代码就可以了。为什么呢?

正如我上面所写,你不需要为你的班级申报一个,但你需要打电话给它。否则您的代码可能无法正常工作。

强烈建议

[super init]为超类提供正确配置新创建对象的机会。

答案 2 :(得分:1)

不调用super init是一个错误,结果是未定义的。 (我发生的坏事)

答案 3 :(得分:-1)

-init()是NSObject的初始化程序。如果用户创建了继承NSObject的Person类。它可以覆盖此初始值设定项,也可以创建自己的自定义初始值设定项,如下所示 例如

    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
        }

    }