2012-04-13 42 views
12

在本书中,我看到,如果一个子类覆盖超类的方法,我们可以有为什么在Objective-C中,我们使用self = [super init]而不是[super init]?

self = [super init]; 

首先,这应该在子类中的方法init要做些什么呢?

其次,我不知道为什么呼叫不仅仅是

[super init]; 

?我的意思是,在拨打init时,内存已经被分配了alloc(我认为是[Foobar alloc],其中Foobar是子类的名字,所以我们不能只调用[super init]来初始化成员变量吗?为什么我们必须得到返回值的init并分配到self?我的意思是,之前调用[super init]self应指向一个有效的内存分配盘...那么,为什么再次分配的东西自我?

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

+3

http://cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html – 2012-04-13 11:24:46

+1

@AndreasCarlbom辉煌的教程,谢谢... – Krishnabhadra 2012-04-13 11:33:34

+0

可能重复的[为什么我应该打电话self = \ [super init \]](http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init) – 2012-04-13 17:53:28

回答

10

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

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

为什么我们将[超级初始化]自这里?

课本的原因是因为[超级初始化]被允许做的 三件事之一:

  1. 与 返回其自身的接收器(自指针不改变)继承的实例值进行初始化。
  2. 返回与 不同的对象被初始化的继承实例值。
  3. 返回零,表示失败。

在第一种情况中,分配对自没有效果和 instanceString在原始对象(线 instanceString = [ASTRING保留]设置;本来的 的方法中的第一线结果将是相同的)。

在第三种情况下,初始化失败。 self设置为零, 不采取进一步行动并返回nil。

分配到自身与第二 情况下,相关的基本原理:如果返回的对象是不同的,我们想要的:

instanceString = [aString retain]; which gets converted to 

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

,所以我们必须改变自身的价值指向这个新目的。

希望这有助于...

From Cocoa with Love

+0

有趣......所以如果'self'指向某些内存分配,然后'self'设置为'nil',那么它就像......将自己变成某种幻象?例如,如果它是一个Duck对象,那么'duck'指向有成员变量的有效内存分配,但现在,当self被设置为'nil'时,它就会变成幻影,就像右边那样现在它不再有成员变量(不指向任何分配的内存),剩下的就是方法,没有任何“实体”的情况下运行代码的能力? – 2012-04-13 11:45:50

+0

NO对象应该释放自己...正常的方法是通过调用-dealloc .. – 2012-04-13 11:54:26

2

有可能是超类可能会决定该对象无法正确初始化,并返回nil作为失败。如果你不指定nil给自己,你的init方法会在父类正确初始化对象的假设下继续进行。

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

2

记者了解到,对象已经alloced和自我指向的内存。

现在[超初始化]做初始化部分。

1)如果初始化成功自指向同一对象初始化

2)如果初始化失败是init函数返回nil和自我=零之前。现在,我们可以检查对象是否被初始化,如果是通过这个代码做我们的魔法

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

它就像我们使用的ImageView,我们通常使用

UIImageView imgView = [[UIImageView alloc] init]; 

imgView只会有非无值如果alloc和init都成功。

3

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

相关问题