gpt4 book ai didi

ios - 初始化对象的最佳方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 03:26:15 24 4
gpt4 key购买 nike

我已经使用 Objective-C 几年了,但我仍然不确定如何初始化一个对象。我们的问题是:

-(id)init {
self = [super init];
if (self) {
self.backgroundColor = [UIColor blueColor];
self.textColor = [UIColor greenColor];
}
return self;
}

-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor yellowColor];
}
return self;
}

在两种方法中使其初始化相同意味着复制和粘贴代码(巨大的禁忌,由于人为错误导致无穷无尽的问题,例如值不同,如上例所示)或新方法:

-(id)init {
self = [super init];
if (self) {
[self initialSetup];
}
return self;
}

-(id)initialSetup {
self.backgroundColor = [UIColor blueColor];
self.textColor = [UIColor greenColor];
}

这就会产生一个问题,如果一个子类有一个initialSetup方法,调用[self initialSetup]的父类(super class)将调用子类的initialSetup ,从而忽略所有父类(super class)的设置。您可以通过每次附加类名来解决这个问题,例如 initialSetupTextField

虽然这看起来相当困惑。这只是为了初始化一个对象。其他人是怎么做到的?

最佳答案

每个类都应该有一个指定的初始化器;一个真正的 init... 方法变体,必须始终调用以正确初始化类(如 Matt 所述)。

但是,这并不能完全解决问题,因为一个类也可能支持通过取消归档进行实例化,这会在您的问题中遇到相同的“我将通用初始化 goop 放在哪里”的问题。

通常,我会创建如下方法:

- (void)commonInit
{
... common initialization goop goes here ...
}

然后从指定的初始化器和/或 initWithCoder: 调用它first

是的,有点乱,但您无能为力。

减少困惑的一般策略:

• 提供非常非常少的初始化程序;可能是 init + 一个初始化程序,其中包含其他配置的所有可能参数。

• 将super 的初始化程序指定为您的DI 并通过它调用任何其他初始化程序。当您在具有更具体的 DI 的地方进行子类化时(参见 UIViewinitWithFrame:),重写 super 的 DI 以调用 [self initFancy:...] 然后调用 [super initThroughSuperersDI]

关于ios - 初始化对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18191636/

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