5

我一直在关注一些教程,但我正在与自我堕落。有人可以帮忙吗?

我有以下init,它是一个实例方法。

- (id) initWithScore:(int) s {
    self = [super init];

    if (self) {
        score = s;

    }

    return self;
}

现在通读代码,我将 self 设置为 super init,因此 self 现在指向 super。然后我检查 self 是否有效并设置分数等于我在 InitWIthScore 上发送的值。到目前为止,我已经得到了这个。

但是现在我返回指向超级的 self ,那么我如何返回我的子类?

因此,假设有人调用我的类传入 100,我的代码返回的是 super 而不是类,那么它是如何工作的?调用代码的分数如何为 100?

当然,是的,它确实有效,但我不知道为什么:-(

4

2 回答 2

5

此构造允许初始化程序(super初始化程序和您正在编写的初始化程序)以一种失败的方式 -nil如果对象无法初始化,则返回。这也是nilinit在致电后检查的原因super

两者self和都super指向内存中的相同数据结构,即您分配的对象。区别在于这些特殊指针的语言语义:

使用self时,Objective-C 编译器将以您当前的类型启动方法和重载解析。

使用super时,Objective-C 编译器将在类的直接超类型处启动方法和重载解析。换句话说,super即使当前类中存在相同的方法,也只是能够调用超类中的方法的语义。

换句话说(稍微简化),super将内存位置视为超类的实例(例如,您子类化的类型,通常NSObject),而self将内存位置视为指向您定义的类型的常规指针。

如果您打印superself在调试器中,您将看到它们指向相同的内存位置。

于 2012-08-25T10:00:10.873 回答
3

整个对象创建调用看起来有点像这样:

SomeClass *foo = [[SomeClass alloc] initWithScore:100];

现在发生的第一件事就是调用[SomeClass alloc]. 这将SomeClass在内存中创建一个结构并返回一个指向它的指针。接下来是初始化的东西,self上一步的指针在哪里。因此self指向 class 的一个对象SomeClass

不过,这个作业看起来有点奇怪:

self = [super init];

在大多数情况下[super init]不会改变self,它只会返回由[SomeClass alloc]. 但是分配模式允许两个额外的选项:

  1. 超类init可以通过返回来表示构造错误nil,在这种情况下,所有后续初始化程序都会退出并获得一个nil对象。

  2. 超类初始化器可能决定返回一个不同的self指针,例如,如果有一些复杂的缓存正在完成。指针应该再次指向一个SomeClass类型的对象,以便您的代码工作(您可以访问score等)。

我建议你阅读Mike Ash的 The How and Why of Cocoa Initializers。是的,正如 driis 所指出的,意识到这一点self并且两者都指向同一个对象是非常好的。super

于 2012-08-25T09:55:58.660 回答