在 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]的主要内容,如果未能解决你的问题,请参考以下文章