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