gpt4 book ai didi

iphone - Objective C 中令人沮丧的模式

转载 作者:行者123 更新时间:2023-12-01 18:23:48 25 4
gpt4 key购买 nike

Apple 建议不要在初始化程序中使用属性方法,但是如果您需要从初始化程序调用方法,并且还需要在对象初始化后从程序中的其他位置调用该方法,我不确定要遵循的协议(protocol)。例如,您有:

- (id) init
{
self = [super init];

if (self)
{
[self someMethod];
}

return self;

}

- (void) someMethod
{
_x = 0; \\ or self.x = 0 when this method is not called from initializer
}
someMethod其中包含一堆 ivars。问题是,它还需要在对象初始化后稍后在代码中的其他位置调用。我希望访问器在从那里调用时不会在初始化程序中被访问,但我也希望在 someMethod 时访问它们从其他地方调用。有没有一种巧妙的方法来解决这种模式?使用 NSObject 时?使用 UIView 时?使用 UIViewController 时?

最佳答案

要判断忽略该建议是否安全,您必须了解此建议存在的原因。
主要问题是具有副作用的 getter 和 setter,因为它们基于实例变量执行计算,而这些实例变量在您调用 setter(或 getter)时可能未初始化。

以以下代码为例:

- (id)init {
self = [super init];
if (self) {
// don't do this
self.textColor = [UIColor blackColor];
self.font = [UIFont boldSystemFontOfSize:17];

// do this:
_textColor = [UIColor blackColor];
_font = [UIFont boldSystemFontOfSize:17];
[self createLayers];
}
return self;
}

- (void)setFont:(UIFont *)font {
if (font) {
_font = font;
[self createLayers];
}
}

- (void)setTextColor:(UIColor *)textColor {
if (textColor) {
_textColor = textColor;
[self createLayers];
}
}

- (void)createLayers {
// calculation that will crash if font or textColor is not set
}

因为如果 textColor 或 font 为 nil,createLayers 会崩溃,因此在 init 中使用 setter 会使您的代码崩溃。

关于iphone - Objective C 中令人沮丧的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471616/

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