gpt4 book ai didi

ios - 在执行 self = [super init] 后,Objective C 是否 self 指向父级?

转载 作者:行者123 更新时间:2023-12-01 17:20:56 25 4
gpt4 key购买 nike

当我有如下代码时:

self = [super init]

self 指向 super 吗?如果是这样,你为什么要这个?如果我的实例对象具有变量“someVal”,我将无法通过执行 [self someVal] 来获得它。正确的?

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

最佳答案

does self point to super?



真的是反过来了。 super真的和 self一样,除了它告诉编译器开始寻找从父类(super class)而不是类本身开始的方法实现。您可以通过记录 super 的值来检查这一点。和 self 的值;你会发现它们都指向同一个地址。

当你创建一个对象时,你这样做:
Foo *f = [[Foo alloc] init];
alloc分配将成为您正在创建的对象的内存,但在该内存被初始化之前,它只是一块内存——不是一个有效的对象。如 FooBar 的子类和 BarNSObject 的子类,然后按照惯例 Foo 的初始化程序将调用 Bar 的,而 Bar 的将调用 NSObject 的,以便初始化按顺序进行:首先内存由 NSObjects 的 -init 初始化。 , Bar 的 init 接收返回值并赋值给 self .然后继续执行任何 Bar 特定的初始化,并返回 self .福氏 -init然后将返回值赋给 self再次并最后执行任何特定于 Foo 的初始化。

所有分配给 self可能看起来既多余又令人困惑。这实际上只是一个约定,但目的是允许父类(super class)的初始化程序返回一些不同于已分配对象的对象,包括 nil .所以,例如,如果 Bar 的初始化由于某种原因失败, -[Bar init]可以返回零。 nil的可能性可能会从 [super init] 返回这就是我们放置 self = [super init] 的原因在条件中赋值:如果赋值为 nil , 初始化部分被跳过和 nil被退回。也有可能是 -[Bar init]可以返回一个指向分配对象以外的对象的指针,例如当与正在创建的对象类似的对象已经存在并且可以重用时。

大多数情况下,您从 -init 返回的指针将与您从 +alloc 获得的相同,所以你可以这样写:
Foo *f = [Foo alloc];
[f init];

然而,如果你这样写,你就假设你的类的初始化器和它继承的所有类将始终返回相同的对象,并且永远不会返回 nil .通过这样做,您将打破惯例并严重阻碍您自己以及编写 Foo 继承的类的任何人——如果他们在该类的 future 版本中返回不同的对象,他们将破坏您的代码。而且,看起来你不知道自己在做什么。

关于ios - 在执行 self = [super init] 后,Objective C 是否 self 指向父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14942567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com