在做self = [super init]之后,Objective C会自我指向父级吗?

use*_*123 1 objective-c ios

当我有如下代码:

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

自我指向超级?如果是这样,你为什么要这样?如果我的实例对象具有变量"someVal",我将无法通过[self someVal]来实现它.正确?

当self指向super时,我如何使用self来获取实例变量?

Cal*_*leb 5

自我指向超级?

它实际上是另一种方式.super实际上是相同的self,除了它告诉编译器开始寻找以超类而不是类本身开始的方法实现.您可以通过记录值super和值来检查self; 你会发现他们都指向同一个地址.

创建对象时,执行以下操作:

Foo *f = [[Foo alloc] init];
Run Code Online (Sandbox Code Playgroud)

alloc分配,将成为正在创建的对象的内存,但直到内存初始化它只是一个内存块-不是有效的对象.如果Foo是子类,Bar并且Bar是它的子类NSObject,那么按照惯例,Foo的初始化器将调用Bar,而Bar将调用NSObject,以便初始化按顺序进行:首先由NSObjects初始化内存-init,并且Bar的init接收返回值并分配给self.然后它继续执行任何特定于Bar的初始化,并返回self.-init然后Foo 再次分配返回的值self,最后进行任何Foo特定的初始化.

分配给所有这些self可能看起来既冗余又令人困惑.它实际上只是一个约定,但目的是允许超类的初始值设定项返回除已分配的对象之外的其他对象,包括nil.因此,例如,如果由于Bar某种原因初始化失败,则-[Bar init]可能返回nil.nil可能返回的可能性[super init]是我们将self = [super init]赋值放在条件中的原因:如果赋值是nil,则跳过初始化部分并nil返回.也有-[Bar init]可能返回指向除分配对象之外的对象的指针,例如当与正在创建的对象类似的对象已经存在且可以重用时.

大多数情况下,你从中获取的指针与你从中获得的指针-init是相同的+alloc,所以你可以这样写:

Foo *f = [Foo alloc];
[f init];
Run Code Online (Sandbox Code Playgroud)

但是,如果你编写它,那么你假设你的类的初始值设定项和它继承的所有类将始终返回相同的对象,并且永远不会返回nil.通过这样做,你破坏了约定并严重妨碍了自己以及编写Foo继承的类的人 - 如果他们在类的未来版本中返回不同的对象,他们将破坏你的代码.而且,看起来你不知道自己在做什么.