0

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

4

3 回答 3

12

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

一个很快就编出来的(因此可能很差)的类比——在你被创造之前,你的父母必须被创造出来(超类),他们必须首先创造他们的父母(他们的超类)

我建议您搜索面向对象的编程基础知识来了解这类事情。

于 2012-04-12T13:13:10.223 回答
0

您提到“检查”让我认为您将其=视为比较操作。它不是。这是一个任务。有时,分配出现在if条件中。这是利用赋值表达式有一个值的事实——被赋值的值。因此,if (self = [super init])结合了“调用 super 的-init方法”、“将结果分配给self“检查我们是否从 super 的方法中获得了非 nil -init”(也就是说,该 super 没有初始化失败)。

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

self = [super init];
if (self)
    // ... continue initializing ...
于 2012-04-14T15:40:49.390 回答
-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 AClass A将是 的超类Class B。又是另一个Class C继承自的类,将是Class B的超类。很快。Class CClass 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 方法。

于 2012-04-12T13:30:40.803 回答