我一直在关注一些教程,而且我正在堕落。有人可以帮忙吗?
我有以下init,这是一个实例方法。
- (id) initWithScore:(int) s {
self = [super init];
if (self) {
score = s;
}
return self;
}
现在通过代码阅读我将自己设置为超级init,因此self现在指向super。然后我检查自我是否有效并将得分设置为我在InitWIthScore上发送的值。到目前为止,我已经得到了这个。
但是现在我返回指向超级的self,那么我如何返回我的子类?
因此,让我们说有人叫我的班级传递100,我的代码返回超级而不是类,所以它是如何工作的?调用代码的得分值是多少?
当然,是的确有效,但我不明白为什么: - (
答案 0 :(得分:5)
此构造允许初始化程序(super
初始化程序和您正在编写的初始化程序)使用失败方法 - 如果无法初始化对象,则返回nil
。这也是您在致电nil
后在init
中查看super
的原因。
self
和super
都指向内存中的相同数据结构,即您分配的对象。不同之处在于这些特殊指针的语言语义:
当使用self
时,Objective-C编译器将以当前类型启动方法和重载解析。
当使用super
时,Objective-C编译器将在类的直接超类型上启动方法和重载解析。换句话说,super
只是能够在超类中调用方法的语义,即使当前类中存在相同的方法。
换句话说(略微简化),super
将内存位置视为超类的一个实例(例如,您子类的类型,通常是NSObject
),而self
将内存位置视为指向已定义类型的常规指针。
如果在调试器中打印super
和self
,您会看到它们指向相同的内存位置。
答案 1 :(得分:3)
整个对象创建调用看起来有点像这样:
SomeClass *foo = [[SomeClass alloc] initWithScore:100];
现在发生的第一件事是调用[SomeClass alloc]
。这将在内存中为SomeClass
创建一个结构并返回指向它的指针。接下来是初始化的东西,其中self
是上一步的指针。因此self
指向类SomeClass
的对象。
但这项任务看起来有点奇怪:
self = [super init];
在大多数情况下,[super init]
不会更改self
,它只会返回由[SomeClass alloc]
创建的指针。但是赋值模式允许两个额外的选项:
超类init
可以通过返回nil
来发出构造错误信号,在这种情况下,所有后续初始值设定项都会失败,并且您将获得nil
个对象。
超类初始值设定项可能决定返回不同的self
指针,例如,如果正在进行一些精心设计的缓存。指针应再次指向SomeClass
类型的对象,以便您的代码有效(您可以访问score
等)。
我建议您阅读Mike Ash的The How and Why of Cocoa Initializers。是的,很高兴认识到self
和super
都指向同一个对象,正如driis所指出的那样。