将超类的返回对象分配给self

时间:2011-02-07 14:28:14

标签: objective-c

我现在已经阅读了很多关于此的帖子,但我还是不明白。我会批评答案而不是链接,因为我可能已经阅读过了。

if (self = [super init]) {

}

return self;

当我调用[super init]时,我知道我在“self”(对象地址)上调用方法,但我在超类中启动“方法搜索”。当这返回时,我将对象类型 id 分配给自己......这就是我迷路的地方。

我是否将“self”指定为初始化对象,直到超类自我为止..?

我理解我正在进行此检查以停止初始化,如果初始化程序的超类实现返回nil但是我不明白我在为自己做什么......我认为self是内存中当前对象的地址

提前致谢

3 个答案:

答案 0 :(得分:4)

这项任务对我来说似乎总是有些苛刻。它的主要观点是超类可能想要返回一些其他实例而不是最初分配的实例:

id foo = [[Foo alloc] init];

@interface Foo : SuperFoo {…}
@implementation Foo

- (id) init
{
    self = [super init];
    if (!self)
        …;
    return self;
}

@interface SuperFoo : NSObject {…}
@implementation SuperFoo

- (id) init
{
    [self release];
    return [OtherClass alloc];
}

这确实很疯狂,但事实是[super init]可能会返回与之前self不同的对象。请参阅Mike Ash’s blog post,这应该明确super

答案 1 :(得分:2)

有两个原因,为什么这项任务很重要:

  1. 如果初始化失败,超类的指定初始值设定项(di)可能会返回nil 在这种情况下,如果没有将其返回值赋值给self,您将最终处于完全不安全的状态 - 很可能,您的超类的di将释放self指向的对象为了不泄漏记忆。
    如果你继续使用那个实例而且你很幸运,你应该在不久的将来看到崩溃。如果你没那么幸运,那么在你的程序崩溃之前,你将会弄乱其他对象的内部状态并丢失或损坏用户数据。
  2. Cocoa(Touch)中有很多类 - 像NSStringNSArray这样的类集群可能是最突出的例子 - 可能会从它们的di中返回不同的实例。 /> 例如,您将从[NSString alloc]收到的指针几乎肯定与您在initWithFormat:@"Hello %@!", @"foo"的后续调用中获得的指针不同。

答案 2 :(得分:1)

让我们把它分成更小的块:

1-当你的调用[super init]让你的超级类首先运行它的init函数时,它可以初始化你继承的对象,通常是NSObject或你决定扩展的任何超类。 超级初始化函数将在该过程结束时返回self,就像在init函数中执行一样

2-当你完成任务时:self = [super init]你实际上将你的超级回报值分配给你自己。

3- if 围绕该分配实际评估超级初始化呼叫的成功/失败,如果失败则会导致 nil 返回并且分配对自己来说是没有意义的。所以评估nil将返回false,你不会运行你的初始化代码。

4-最终你也会返回self(如果成功则失败/执行对象,则为nil)

希望能够清除它。