谁能给我一个关于“self = super init”的简单解释?

时间:2012-04-12 13:09:06

标签: iphone xcode

我仍然不理解self = super init;虽然我读了很多书和谷歌。 我知道它用于检查当前对象等于来自父类等的返回对象。 但是,我不能接受这就是答案。有人可以给我一个简单但可靠的答案吗? 谢谢!

3 个答案:

答案 0 :(得分:12)

快速回答是你告诉你班级的超级班级初始化对象。因为您继承自那个超类,所以您可以执行特定于您的实现的其他初始化任务,但首先您必须确保执行初始化的基础知识(由基类NSObject处理)。从另一个类扩展(继承)的每个类必须确保它们的超类在初始化之前已经初始化。

一个非常快速组成(因此可能很差)的模拟 - 在你被创造之前,你的父母必须被创造(超级类)并且他们必须首先创建他们的父母(他们的超级类)

我建议你搜索面向对象的编程基础来学习这类东西。

答案 1 :(得分:0)

您提到“检查”会让我认为您将=视为比较操作。不是。这是一项任务。有时,分配出现在if条件下。这是利用赋值表达式具有值的值这一事实 - 已分配的值。因此,if (self = [super init])结合了“呼叫超级-init方法”,“将结果分配给self”,“检查我们是否从超级{非{ {1}}“(也就是说,super超级无法初始化)。

由于这种组合分配和测试可能令人困惑且容易出错,Apple现在建议将分配与检查失败分开:

-init

答案 2 :(得分:-1)

NSObject是根类。 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html 你可以在那里找到init方法。 init类中的NSObject方法是Objective-C中每个对象的初始值设定项。 super只返回一个对象的超类。

如果Class B继承自Class A,则Class A将成为Class B的超类。另一个继承自Class C的班级Class BClass C的超级班级将是Class B。等等。

当你从一个类中调用[super init];时,它只需调用其超类的init方法,然后调用其超类的init方法,依此类推。最后它将到达根对象NSObject,并调用真正的init方法。此时,iOS将为您的对象分配内存,并为您的对象分配必要的数据结构。阅读有关NSObject类中每个方法和属性的文档。

如果您创建的类MyViewUIView的子类,那么您的类层次结构将是。

     NSObject

UIAppearanceContainer

   UIAppearance

     NSCoding

      UIView

      MyView

因此,当您在班级“MyView”中调用init方法时,它会调用

UIView的init方法

UIView将调用NSCoding的init方法

NSCoding将调用UIAppearance的init方法

UIAppearance将调用UIAppearanceContainer的初始化方法

UIAppearanceContainer将调用NSObject的init方法。