在 NSObject 子类的自定义 init 方法中使用 self = [super init]

Posted

技术标签:

【中文标题】在 NSObject 子类的自定义 init 方法中使用 self = [super init]【英文标题】:Use of self = [super init] in custom init method of NSObject subclass 【发布时间】:2011-10-13 10:29:52 【问题描述】:

我正在继承 NSObject

@interface MyClass : NSObject 


-(id)customInit;
@end

并在其中实现自定义的 init 方法,

-(id)customInit

    self = [super init];
    if(self)
    
        return self;
    
    return nil;

并如下创建 MyClass 的实例

MyClass *myClassInstance = [[MyClass alloc]customInit];

现在我的问题是,如果我使用没有 self = [super init]; 的 customInit 方法,我会错过什么?如下图,

  -(id)customInit
    
       return self;
    

我会错过超类 NSObject 类中的任何内容吗?谢谢

【问题讨论】:

附带说明,名称init 在内存管理方面具有与customInit 不同的特殊含义。对于前者,静态分析器计划为 +1 引用计数和后者 +0。如果你想要一个不只是init 的自定义init,你应该做类似initCustom 的事情。 【参考方案1】:

不,你不会错过任何东西。来自documentation:

NSObject 类中定义的init 方法不进行初始化;它只是返回self

但是,我仍然建议您致电 self = [super init],以便将来证明您的代码,以防您决定更改基类。

【讨论】:

【参考方案2】:

如果我在我的 customInit 方法中没有 [super init],我将错过 NSObject 的 init 方法所做的工作。但除此之外,当我继承它时,我将可以访问超类及其协议的所有方法。

【讨论】:

您可能只是在引用一个幻想示例,但值得注意的是,将您的 init 称为“customInit”而不是“initFoo”违反了惯例,并且可能会使其他开发人员感到困惑。在上面的这种情况下,只需调用方法“init”。 @JessBowers 是的,我知道这一点。我只想知道幕后发生了什么。 :)

以上是关于在 NSObject 子类的自定义 init 方法中使用 self = [super init]的主要内容,如果未能解决你的问题,请参考以下文章

需要继承 NSManagedObject 的自定义类的子类

如何在 NSObject 类中添加动态行为:Swift

如何使子类化的自定义 Django 表单字段不再是必需的?

如何发布自定义 NSObject 属性以保存 MySQL

NSObject

在 NSObject 的子类上实现啥方法以允许在 swift 操场上进行漂亮的打印?