在一本书中,我看到如果一个子类覆盖超类的方法,我们可能会
self = [super init];
Run Code Online (Sandbox Code Playgroud)
首先,这应该在子类的init方法中完成吗?
其次,我想知道为什么这个电话不仅仅是
[super init];
Run Code Online (Sandbox Code Playgroud)
?我的意思是,在调用时init,内存alloc已经被分配了(我认为子类的名称[Foobar alloc]在哪里Foobar.所以我们不能只调用[super init]初始化成员变量?为什么我们必须得到返回值init和赋值到self?我的意思是,在调用之前[super init],self应指向一个有效的内存分配盘...那么,为什么再次分配东西的自我?
(如果分配,不会[super init]只返回self现有值吗?)
Ank*_*ava 10
那么为什么要将[super init]返回的值赋给self?查看典型的初始化方法:
- (id)initWithString:(NSString *)aString {
self = [super init];
if (self)
{
instanceString = [aString retain];
}
return self; }
Run Code Online (Sandbox Code Playgroud)
为什么我们在这里指定[super init]?
教科书的原因是因为[super init]被允许做以下三件事之一:
- 使用初始化的继承实例值返回自己的接收器(自指针不会更改).
- 返回具有已初始化的继承实例值的其他对象.
- 返回零,表示失败.
在第一种情况下,该分配对自没有效果和instanceString在原始对象中设置上(线instanceString = [ASTRING保留];本来是该方法的第一行和其结果将是相同的).
在第三种情况下,初始化失败.self设置为nil,不再采取进一步操作并返回nil.
分配给self的基本原理与第二种情况相关:如果返回的对象不同,我们希望:
Run Code Online (Sandbox Code Playgroud)instanceString = [aString retain]; which gets converted to self->instanceString = [aString retain]; to act on the correct value,所以我们必须改变self的值来指向这个新对象.
希望这有助于......
| 归档时间: |
|
| 查看次数: |
3178 次 |
| 最近记录: |