Objective-c:关于self = [super init]的问题

Cod*_*elp 24 objective-c ios


self = [super init]在init方法中看到过.我不明白为什么.不会[super init]返回超类?如果我们指出self = [super init],我们没有得到self = superclass
这是一个示例代码片段

- (id)init 
{
    if (self = [super init]) {
        creationDate = [[NSDate alloc] init];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

希望有人能为我澄清一下.谢谢.

Mar*_*n R 45

假设它MyClass是一个子类BaseClass,当你调用时会发生以下情况

MyClass *mc = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)
  1. [MyClass alloc]分配一个实例MyClass.
  2. init消息被发送到该实例完成初始化过程.
    在该方法中,self(所有Objective-C方法的隐藏参数)是步骤1中分配的实例.
  3. [super init]调用超类实现init具有相同(隐藏) self的说法.(这可能是你错误理解的一点.)
  4. init的方法BaseClass,self仍然是同一个实例MyClass.这个超类init方法现在也可以

    • 做基本初始化self和返回self,或
    • 丢弃self并分配/初始化并返回不同的对象.
  5. 回到以下init方法MyClass:self = [super init]现在要么

    • MyClass在步骤1中分配的对象,或
    • 有些不同.(这就是为什么人们应该检查并使用这个返回值.)
  6. 初始化完成(使用self超类init返回的).

所以,如果我理解你的问题,那么重点是

[super init]
Run Code Online (Sandbox Code Playgroud)

init使用self参数调用超类实现,该参数是一个MyClass对象,而不是一个BaseClass对象.


小智 6

正如你self = [super init]在if条件中提出的问题提出了具体含义.

首先[super init]给出了当前正在使用的现有类的超类的初始化.Using [super init]给出了超类初始化,它表明该类存在对象.

现在当你使用self = [super init]它意味着你将类分配给self以进一步利用同一个类.

最后你把它放在if条件中,因为if(self = [super init])这意味着你正在检查类的对象是否存在不是为了防止应用程序的犯规行为.

我觉得现在很清楚!!!