为什么在Objective-C中,我们使用self = [super init]而不仅仅是[super init]?

时间:2012-04-13 11:13:27

标签: objective-c

在一本书中,我看到如果一个子类覆盖超类的方法,我们可能有

self = [super init];

首先,这应该在子类的init方法中完成吗?

其次,我想知道为什么这个电话不仅仅是

[super init];

?我的意思是,在调用init时,内存已由alloc分配(我认为[Foobar alloc] Foobar是子类的名称。所以我们不能只需调用[super init]来初始化成员变量?为什么我们必须获得init的返回值并分配给self?我的意思是,在调用[super init]之前,{{ 1}}应该指向一个有效的内存分配chuck ...那么为什么要再给自己分配一些东西呢?

(如果分配,self不会只返回[super init]的现有值吗?)

4 个答案:

答案 0 :(得分:10)

  

那么为什么要将[super init]返回的值赋给self?看着   典型的初始化方法:

 - (id)initWithString:(NSString *)aString {
     self = [super init];
     if (self)
     {
         instanceString = [aString retain];
     }
     return self; }

为什么我们在这里为自己分配[super init]?

  

教科书的原因是因为[super init]被允许做其中一个   三件事:

     
      
  1. 返回自己的接收器(自指针不会改变)   继承的实例值已初始化。
  2.   
  3. 返回一个不同的对象   继承的实例值已初始化。
  4.   
  5. 返回零,表示失败。
  6.         

    在第一种情况下,作业对自己和作品没有影响   instanceString在原始对象(行中)中设置   instanceString = [aString retain];可能是第一线   方法和结果是一样的。)

         

    在第三种情况下,初始化失败。自我设定为零,   不采取进一步行动,返回零。

         

    分配给自己的理由与第二个相关   case:如果返回的对象不同,我们想要:

    instanceString = [aString retain]; which gets converted to
    
    self->instanceString = [aString retain]; to act on the correct value,
    
         

    所以我们必须将self的值更改为指向这个新对象。

希望这会有所帮助......

From Cocoa with Love

答案 1 :(得分:3)

-init返回不同对象的典型示例是实现类集群 - 具有多个具体实现者的抽象接口,提供不同的存储或算法。 +[NSString alloc]返回NSPlaceholderString的实例。占位符实例的初始化程序检查其参数,释放占位符字符串并返回具体NSString子类的初始化实例。

答案 2 :(得分:2)

超类可能决定对象无法正确初始化并返回nil作为失败。如果你没有为自己分配nil,你的init方法将在父类正确初始化对象的假设下进行。

如果需要,父类也可以返回完全不同的对象。

答案 3 :(得分:2)

了解对象已经分配,​​自我指向内存。

现在[super init]执行初始化部分。

1)如果初始化成功,则在初始化之前,self指向同一个对象

2)如果初始化失败,init函数返回nil和self = nil。现在我们可以检查对象是否已初始化,如果是,则通过此代码执行我们的魔法

 if(self = [super init]){
  // do our magic
 }

IT就像我们使用imageView一样,我们通常使用

UIImageView imgView = [[UIImageView alloc] init];

如果alloc和init都成功,imgView将只有非零值。