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

Objective c 在NSObject子类的自定义init方法中使用self=[super init],objective-c,ios,oop,Objective C,Ios,Oop,我是NSObject的子类 @interface MyClass : NSObject { } -(id)customInit; @end 并在其中实现自定义init方法 -(id)customInit { self = [super init]; if(self) { return self; } return nil; } 并创建MyClass的一个实例,如下所示 MyClass *myClassInstance = [[MyCl

我是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类中的任何内容吗?谢谢

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

不,您不会错过任何东西。从:

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


但是,我仍然建议调用
self=[super init]
,以便将来在您决定更改基类时验证您的代码。

您可能只是引用了一个虚构的示例,但值得注意的是,将您的init调用为“customInit”而不是“initFoo”违反惯例,可能会使其他开发人员感到困惑。在上面的例子中,只需调用方法“init”。@JessBowers是的,我知道这一点。我只想知道幕后发生了什么。:)作为旁注,名称
init
对于内存管理具有特殊意义,这与
customInit
不同。对于前者,静态分析器计划+1引用计数,而后者计划+0。如果您想要一个自定义的
init
,而不仅仅是
init
,您应该执行类似于
initCustom
的操作。