我仍然不理解self = super init;虽然我读了很多书和谷歌。 我知道它用于检查当前对象等于来自父类等的返回对象。 但是,我不能接受这就是答案。有人可以给我一个简单但可靠的答案吗? 谢谢!
答案 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 B
,Class C
的超级班级将是Class B
。等等。
当你从一个类中调用[super init];
时,它只需调用其超类的init
方法,然后调用其超类的init
方法,依此类推。最后它将到达根对象NSObject,并调用真正的init
方法。此时,iOS将为您的对象分配内存,并为您的对象分配必要的数据结构。阅读有关NSObject类中每个方法和属性的文档。
如果您创建的类MyView
是UIView
的子类,那么您的类层次结构将是。
NSObject
UIAppearanceContainer
UIAppearance
NSCoding
UIView
MyView
因此,当您在班级“MyView”中调用init
方法时,它会调用
UIView的init方法
UIView将调用NSCoding的init方法
NSCoding将调用UIAppearance的init方法
UIAppearance将调用UIAppearanceContainer的初始化方法
UIAppearanceContainer将调用NSObject的init方法。