理解'自我'并将自我设定为超级

Mar*_*tin 5 objective-c ios

我一直在关注一些教程,而且我正在堕落.有人可以帮忙吗?

我有以下init,这是一个实例方法.

- (id) initWithScore:(int) s {
    self = [super init];

    if (self) {
        score = s;

    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

现在通过代码阅读我将自己设置为超级init,因此self现在指向super.然后我检查自我是否有效并将得分设置为我在InitWIthScore上发送的值.到目前为止我有这个.

但是现在我返回指向超级的self,那么我如何返回我的子类?

因此,让我们说有人叫我的班级传递100,我的代码返回超级而不是类,所以它是如何工作的?调用代码的得分值是多少?

当然,是的它确实有效,但我不明白为什么:-(

dri*_*iis 5

如果无法初始化对象,则此构造允许初始化程序(super初始化程序和您正在编写的初始化程序)具有失败方式nil.这也是为什么您检查nil您的init通话后super.

双方selfsuper指向相同的数据结构在内存中,你已经分配即你的对象.不同之处在于这些特殊指针的语言语义:

self被使用,Objective-C的编译器将在当前的类型入手方法和重载决议.

super被使用,Objective-C的编译器将眼前的超类型类的入手方法和重载决议.换句话说,super即使当前类中存在相同的方法,也只是能够在超类中调用方法的语义.

换句话说(略微简化的),super把所述存储器位置,好像它是超类的实例(例如,类型你子类,常NSObject),而self治疗的存储器位置作为常规指针已定义的类型.

如果您打印superself在调试器中,您将看到它们指向相同的内存位置.