我有一个关于在objective-c中编写自己的init方法的问题。我已经阅读了几本不同的书,并且已经看到了几种方法可以做到,但共识是正确的方法是这样的:
- (id)init
{
self = [super init];
if(self!=nil)
{
}
return self;
}
我对“self = [super init]”这一行感到有些困惑。我的理解是,不能保证[super init]会返回你期望它的类。我认为这被称为“类集群”。但是在正常的情况下,它确实会返回你期望的类,如果我将self设置为指向返回给我的类,我不是只说自我指的是一个不同类的对象而是比我在init方法中的类?
总结一下,为什么将self设置为超类与我所在的实际类?
我在博客上看到:
教科书的原因是因为[超级 init]被允许做三个中的一个 事情:
1)返回自己的接收器(自我 继承的指针不会改变 实例值已初始化。 2)退货a 继承的不同对象 实例值已初始化。 3)回归 没有,表示失败。在第一个 情况下,作业没有效果 自...
“作业对自我没有影响”让我感到困惑。为什么没有效果?如果我把东西设置为其他东西,那不应该有影响吗?
答案 0 :(得分:3)
对于编写-init
方法的正确方法有不同的看法。有两个原因可以让你认为self = [super init]
是一个好主意。 (赋值本身并不特别; Objective-C认为self
是方法的隐藏参数,您可以重新分配参数。更改的self
仅适用于方法的其余部分。)
-init
返回不同类正如您所建议的,某些类使用“类集群”模式。但是,在此模式的最常见实现中,基类上的-alloc
方法可能返回不同类的实例,并且占位符类上的所有-init...
方法都是可能会返回不同类的实例。 self = [super init]
在这里没用。
-init
返回同一类这是推荐self = [super init]
的原因。某些类具有允许-init
返回与调用它的实例不同的实例的逻辑。例如,Cocoa框架中的一些单例类就可以做到这一点。但几乎在所有情况下,您都需要知道超类的这种行为才能正确地对其进行子类化。 self = [super init]
[super init]
实际上并不是非常有用,因为无论如何self
都会返回{{1}},或者您正在继承的类非常复杂,重新分配自我然后继续无论如何,初始化都不会起作用。
答案 1 :(得分:2)
总结一下,为什么将self设置为超类与我所在的实际类?
这是Apple建议的做事方式,特别是由于类集群的情况,如你所说。
一般情况下,您不应该担心self
在“正常”情况下可能属于不同的类别。
self
只是标识您所在的对象,而不是类(该类实际上是运行时中的另一个对象)。如果你想到OO继承属性,它同时也是它的类及其超类的对象(如果它清楚我想说的话)。 “正常”情况没有矛盾,因为self
的值不会改变。
此外,您可以将self
视为指向对象的特殊指针。在集群案例中,self
可能会发生变化,这就是为什么它的类会发生变化的原因。
希望这有助于澄清事情。您还可以在article by Wil Shipley找到一个有趣的读物。