我还是不明白 self=super init; ,虽然我读了很多书和谷歌。我知道它用于检查当前对象是否等于父类的返回对象等。但是,我不能接受这是答案。有人可以给我一个简单但可靠的可接受的答案吗?谢谢!
3 回答
快速的回答是你告诉你的类的超类来初始化对象。因为您是从该超类继承的,所以您可以执行特定于您的实现的其他初始化任务,但首先您必须确保执行初始化的基础知识(由基类 NSObject 处理)。从另一个类扩展(继承)的每个类都必须确保它们的超类已经初始化,然后才能进行初始化。
一个很快就编出来的(因此可能很差)的类比——在你被创造之前,你的父母必须被创造出来(超类),他们必须首先创造他们的父母(他们的超类)
我建议您搜索面向对象的编程基础知识来了解这类事情。
您提到“检查”让我认为您将其=
视为比较操作。它不是。这是一个任务。有时,分配出现在if
条件中。这是利用赋值表达式有一个值的事实——被赋值的值。因此,if (self = [super init])
结合了“调用 super 的-init
方法”、“将结果分配给self
”和“检查我们是否从 super 的方法中获得了非 nil -init
”(也就是说,该 super 没有初始化失败)。
因为这种组合的分配和测试可能会令人困惑且容易出错,Apple 现在建议将分配与失败检查分开:
self = [super init];
if (self)
// ... continue initializing ...
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
因此,当您init
在“MyView”类中调用方法时,它会调用
UIView的init方法
UIView 会调用 NSCoding 的 init 方法
NSCoding 会调用 UIAppearance 的 init 方法
UIAppearance 会调用 UIAppearanceContainer 的 init 方法
UIAppearanceContainer 将调用 NSObject 的 init 方法。