【问题标题】:Can anyone give me an easy explanation about "self=super init"?谁能给我一个关于“self = super init”的简单解释?
【发布时间】:2023-03-24 22:55:01
【问题描述】:

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

【问题讨论】:

    标签: iphone xcode


    【解决方案1】:

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

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

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

    【讨论】:

    • +2 为答案,-1 为我父母的视觉效果 :)
    【解决方案2】:

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

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

    self = [super init];
    if (self)
        // ... continue initializing ...
    

    【讨论】:

    • 在 C 中,对于布尔测试,任何非零值的计算结果都为真。 NULL 指针和 nil 转换为零,因此对于布尔测试为 false。
    【解决方案3】:

    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 BClass 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 方法。

    【讨论】:

    • 上例的第二步,UIView会自动调用NSCoding的init方法还是需要在UIView中再写一个self =super init?
    • 在 UIView 里面有一个调用 self=[super init] 和每个方法一样
    • 我想知道这个答案有什么问题。请输入您的评论(谁反对这个答案:))。
    猜你喜欢
    • 2011-03-04
    • 2013-10-10
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多