gpt4 book ai didi

objective-c - 我为什么要调用 self=[super init]

转载 作者:太空狗 更新时间:2023-10-30 03:08:55 24 4
gpt4 key购买 nike

假设我创建了我的类及其 init 方法。为什么我应该调用并返回分配给自己的父类(super class) init 的值?它涵盖了哪些案例?

我会很感激为什么我需要它用于 Cocoa 父类(super class)和非 Cocoa 的例子。

最佳答案

你是说为什么

self = [super init];

而不是

[super init];

两个原因:

  1. 在初始化中,失败通过返回 nil 来指示。您需要知道 super 对象的初始化是否失败。
  2. 父类(super class)可能会选择用不同的对象替换+alloc 返回的self。这种情况很少见,但最常发生在 class clusters 中。 .

根据迈克尔的评论编辑:

I can understand why I need to save and return [super init]. But is it just convention and good looking makes us use self as a temporary variable to pass result along?

没有。实例变量是相对于自指针访问的,所以在下面:

-(id) init
{
self = [super init];
if (self != nil)
{
myBoolIvar = YES;
// The above is an implicit version of self->myBoolIvar = YES;
}
return self;
}

self 显然必须指向正确的内存块,即您要返回的内存块。

The other point is that if super init returns different class instance then the rest of the code after that line may not even make sense, lead to memory leaks and crashes, not even talking about the object instantiated from that class.

这可能是个问题。如果我子类化 NSNumber 并且 [super init] 决定返回一个 NSString(它可以 - 没有什么可以阻止它)那显然是一场灾难。无论 super 从 -init 返回什么,都必须在为 ivar 提供空间和进一步子类化的意义上与子类“兼容”,否则它就是一个可怕的错误(当然,除非记录了该问题)。所以,一般来说,你不需要担心检查类。但是,请务必阅读文档。例如,请参阅 NSString 文档中关于子类化 NSString 的部分。

关于objective-c - 我为什么要调用 self=[super init],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2956943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com