Objective-C初始化器和覆盖自我

时间:2011-06-09 16:46:46

标签: objective-c

我有一个关于在objective-c中编写自己的init方法的问题。我已经阅读了几本不同的书,并且已经看到了几种方法可以做到,但共识是正确的方法是这样的:

- (id)init
{
    self = [super init]; 
    if(self!=nil)
    {

    }
    return self;
}

我对“self = [super init]”这一行感到有些困惑。我的理解是,不能保证[super init]会返回你期望它的类。我认为这被称为“类集群”。但是在正常的情况下,它确实会返回你期望的类,如果我将self设置为指向返回给我的类,我不是只说自我指的是一个不同类的对象而是比我在init方法中的类?

总结一下,为什么将self设置为超类与我所在的实际类?

我在博客上看到:

  

教科书的原因是因为[超级   init]被允许做三个中的一个   事情:

     

1)返回自己的接收器(自我   继承的指针不会改变   实例值已初始化。 2)退货a   继承的不同对象   实例值已初始化。 3)回归   没有,表示失败。在第一个   情况下,作业没有效果   自...

“作业对自我没有影响”让我感到困惑。为什么没有效果?如果我把东西设置为其他东西,那不应该有影响吗?

2 个答案:

答案 0 :(得分:3)

对于编写-init方法的正确方法有不同的看法。有两个原因可以让你认为self = [super init]是一个好主意。 (赋值本身并不特别; Objective-C认为self是方法的隐藏参数,您可以重新分配参数。更改的self仅适用于方法的其余部分。)

超类-init返回不同类

的实例

正如您所建议的,某些类使用“类集群”模式。但是,在此模式的最常见实现中,基类上的-alloc方法可能返回不同类的实例,并且占位符类上的所有-init...方法都是可能会返回不同类的实例。 self = [super init]在这里没用。

超类-init返回同一类

的不同实例

这是推荐self = [super init]的原因。某些类具有允许-init返回与调用它的实例不同的实例的逻辑。例如,Cocoa框架中的一些单例类就可以做到这一点。但几乎在所有情况下,您都需要知道超类的这种行为才能正确地对其进行子类化。 self = [super init] [super init]实际上并不是非常有用,因为无论如何self都会返回{{1}},或者您正在继承的类非常复杂,重新分配自我然后继续无论如何,初始化都不会起作用。

答案 1 :(得分:2)

  

总结一下,为什么将self设置为超类与我所在的实际类?

这是Apple建议的做事方式,特别是由于类集群的情况,如你所说。

一般情况下,您不应该担心self在“正常”情况下可能属于不同的类别。

self只是标识您所在的对象,而不是类(该类实际上是运行时中的另一个对象)。如果你想到OO继承属性,它同时也是它的类及其超类的对象(如果它清楚我想说的话)。 “正常”情况没有矛盾,因为self的值不会改变。

此外,您可以将self视为指向对象的特殊指针。在集群案例中,self可能会发生变化,这就是为什么它的类会发生变化的原因。

希望这有助于澄清事情。您还可以在article by Wil Shipley找到一个有趣的读物。