为什么在Objective-C中,我们使用self = [super init]而不仅仅是[super init]?

nop*_*ole 12 objective-c

在一本书中,我看到如果一个子类覆盖超类的方法,我们可能会

self = [super init];
Run Code Online (Sandbox Code Playgroud)

首先,这应该在子类的init方法中完成吗?

其次,我想知道为什么这个电话不仅仅是

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

?我的意思是,在调用时init,内存alloc已经被分配了(我认为子类的名称[Foobar alloc]在哪里Foobar.所以我们不能只调用[super init]初始化成员变量?为什么我们必须得到返回值init和赋值到self?我的意思是,在调用之前[super init],self应指向一个有效的内存分配盘...那么,为什么再次分配东西的自我?

(如果分配,不会[super init]只返回self现有值吗?)

Ank*_*ava 10

那么为什么要将[super init]返回的值赋给self?查看典型的初始化方法:

 - (id)initWithString:(NSString *)aString {
     self = [super init];
     if (self)
     {
         instanceString = [aString retain];
     }
     return self; }
Run Code Online (Sandbox Code Playgroud)

为什么我们在这里指定[super init]?

教科书的原因是因为[super init]被允许做以下三件事之一:

  1. 使用初始化的继承实例值返回自己的接收器(自指针不会更改).
  2. 返回具有已初始化的继承实例值的其他对象.
  3. 返回零,表示失败.

在第一种情况下,该分配对自没有效果和instanceString在原始对象中设置上(线instanceString = [ASTRING保留];本来是该方法的第一行和其结果将是相同的).

在第三种情况下,初始化失败.self设置为nil,不再采取进一步操作并返回nil.

分配给self的基本原理与第二种情况相关:如果返回的对象不同,我们希望:

instanceString = [aString retain]; which gets converted to

self->instanceString = [aString retain]; to act on the correct value,
Run Code Online (Sandbox Code Playgroud)

所以我们必须改变self的值来指向这个新对象.

希望这有助于......

从可可与爱