gpt4 book ai didi

iphone - 可以有两个指定的初始化程序吗?

转载 作者:行者123 更新时间:2023-12-01 18:00:33 28 4
gpt4 key购买 nike

我在 UIViewController 的子类中有以下内容;

- (id) initWithFullScreen
{
self = [super initWithNibName:nil bundle:nil];

if (self)
{
_fullScreen = YES;
}

return self;
}
- (id) init
{
self = [super initWithNibName:nil bundle:nil];

if (self)
{
_fullScreen = NO;
}

return self;
}

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
return [self init];
}

如您所见,它们并没有像推荐的那样全部链接在一起,因为有两个初始化器调用指定初始化器的父类(super class)。这样做可以吗?

最佳答案

好的,可以。

指定的初始化器不是 Objective-C 语言的一部分,它只是一个约定。通常,如果您通过一个 init 方法路由所有内容,则不必担心在您可能想要提供的所有其他便利 init 方法中重复代码。

它还让您知道当您想要创建子类时应该在父类(super class)上调用哪个 init 方法。 (您的第三个 init 方法 initWithNibName... 实际上违反了此规则。您只需调用 init ,而不是调用父类(super class)的指定初始化程序。)

在您的情况下,使用方法签名 initWithFullScreen:(BOOL)fullScreen 声明初始化程序并将其指定为指定的初始化程序可能是要走的路。并且在其中你确保你调用了父类(super class)的指定初始化器,你就是。

然后您可以创建便利初始化器:initWithFullScreeninitWithoutFullScreen如果你愿意;他们都只会调用您指定的初始化程序。例如:

- (id)initWithoutFullScreen
{
return [self initWithFullScreen:NO];
}

所以,打破惯例是可以的。你可能有你的理由。但是,如果您坚持下去,通常更容易使您的代码井井有条。

修正案

要获得额外的功劳,请考虑 NSCoding 协议(protocol),该协议(protocol)要求类具有 initWithCoder:方法。有人可能会说它违反了规则,因为采用 NSCoding 并且其父类(super class)也采用 NSCoding 的类必须准备好有两条初始化路径: initWithCoder:。调用 [super initWithCoder:coder] 的方法和常规的指定初始化器。

关于iphone - 可以有两个指定的初始化程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10577824/

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