作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
}
关于iphone - Objective C 中令人沮丧的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471616/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!