理解'自我'并将自我设定为超级

时间:2012-08-25 09:47:41

标签: objective-c ios

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

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

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

    if (self) {
        score = s;

    }

    return self;
}

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

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

因此,让我们说有人叫我的班级传递100,我的代码返回超级而不是类,所以它是如何工作的?调用代码的得分值是多少?

当然,是的确有效,但我不明白为什么: - (

2 个答案:

答案 0 :(得分:5)

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

selfsuper都指向内存中的相同数据结构,即您分配的对象。不同之处在于这些特殊指针的语言语义:

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

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

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

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

答案 1 :(得分:3)

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

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

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

但这项任务看起来有点奇怪:

self = [super init];

在大多数情况下,[super init]不会更改self,它只会返回由[SomeClass alloc]创建的指针。但是赋值模式允许两个额外的选项:

  1. 超类init可以通过返回nil来发出构造错误信号,在这种情况下,所有后续初始值设定项都会失败,并且您将获得nil个对象。

    < / LI>
  2. 超类初始值设定项可能决定返回不同的self指针,例如,如果正在进行一些精心设计的缓存。指针应再次指向SomeClass类型的对象,以便您的代码有效(您可以访问score等)。

  3. 我建议您阅读Mike Ash的The How and Why of Cocoa Initializers。是的,很高兴认识到selfsuper都指向同一个对象,正如driis所指出的那样。