在一本书中,我看到如果一个子类覆盖超类的方法,我们可能有
self = [super init];
首先,这应该在子类的init
方法中完成吗?
其次,我想知道为什么这个电话不仅仅是
[super init];
?我的意思是,在调用init
时,内存已由alloc
分配(我认为[Foobar alloc]
Foobar
是子类的名称。所以我们不能只需调用[super init]
来初始化成员变量?为什么我们必须获得init
的返回值并分配给self
?我的意思是,在调用[super init]
之前,{{ 1}}应该指向一个有效的内存分配chuck ...那么为什么要再给自己分配一些东西呢?
(如果分配,self
不会只返回[super init]
的现有值吗?)
答案 0 :(得分:10)
那么为什么要将[super init]返回的值赋给self?看着 典型的初始化方法:
- (id)initWithString:(NSString *)aString {
self = [super init];
if (self)
{
instanceString = [aString retain];
}
return self; }
为什么我们在这里为自己分配[super init]?
希望这会有所帮助......教科书的原因是因为[super init]被允许做其中一个 三件事:
- 返回自己的接收器(自指针不会改变) 继承的实例值已初始化。
- 返回一个不同的对象 继承的实例值已初始化。
- 返回零,表示失败。
醇>在第一种情况下,作业对自己和作品没有影响 instanceString在原始对象(行中)中设置 instanceString = [aString retain];可能是第一线 方法和结果是一样的。)
在第三种情况下,初始化失败。自我设定为零, 不采取进一步行动,返回零。
分配给自己的理由与第二个相关 case:如果返回的对象不同,我们想要:
instanceString = [aString retain]; which gets converted to self->instanceString = [aString retain]; to act on the correct value,
所以我们必须将self的值更改为指向这个新对象。
答案 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将只有非零值。