![](/img/trans.png)
[英]if (self = [super init]) vs. if ((self = [super init]))
[英]Can anyone give me an easy explanation about “self=super init”?
我仍然不了解self = super init; ,尽管我读了很多书和谷歌。 我知道它用于检查当前对象是否等于父类等的返回对象。但是,我不能接受这就是答案。 有人可以给我一个简单但可靠的答案吗? 谢谢!
快速的答案是,您正在告诉您的类的超类初始化该对象。 因为您是从该超类继承的,所以您可以执行特定于实现的其他初始化任务,但是首先必须确保执行了初始化的基础(由基类NSObject处理)。 从另一个类扩展(继承)的每个类都必须先确保其父类已被初始化,然后才能进行初始化。
一个非常快速组成的(因此可能很差)的类似物-在创建您的父母之前,必须先创建您的父母(超类),并且他们必须首先创建父母(他们的超类)
我建议您搜索面向对象的编程基础知识,以了解这种情况。
您提到“检查”使我认为您将=
视为比较操作。 不是。 这是一项任务。 有时,分配出现在if
条件中。 这利用了赋值表达式具有一个值的事实-被赋值。 因此, if (self = [super init])
组合了“调用super的-init
方法”,“将结果分配给self
” 和 “检查我们是否从super的-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
方法。 NSObject
类中的init
方法是Objective-C中每个对象的初始化程序。 super
仅返回对象的超类。
如果Class B
是从Class A
Class A
继承的,则Class A
Class A
将是Class B
类的超类。 再次另一类Class C
,将其从继承Class B
,超类的Class C
将是Class B
。 等等。
当您调用[super init];
从一个类中,它仅调用init
类的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的init方法
UIAppearanceContainer将调用NSObject的init方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.