重新定义属性的setter时的无限循环

时间:2012-11-25 21:21:40

标签: objective-c properties

在Mac OS X(Hillegass)的Cocoa Programming中,第19章有一个类:

@interface BigLetterView : NSView {
NSColor *bgColor;
}
@property (strong) NSColor *bgColor;
@end

访问者的定义如下:

- (void)setBgColor:(NSColor *)c {
bgColor = c;
[self setNeedsDisplay:YES]; }

这对我来说是正确的,但它会创建一个无限循环:bgColor = c调用setBgColor:c

这段代码是否正确?

如何重新定义二传手?编译此代码需要什么?

2 个答案:

答案 0 :(得分:0)

这样做,看起来更干净,更容易理解。

@interface BigLetterView : NSView
@property (strong) NSColor *bgColor;
@end
@implementation BigLetterView

- (void)setBgColor:(NSColor *)c {
_bgColor = c;
[self setNeedsDisplay:YES]; 
}

另外,制定一个简单的规则,以便在您使用它的任何其他地方始终使用self属性。这是让你清楚地理解事物的更好规则。

答案 1 :(得分:0)

在现代Xcode / llvm中,您可以稍微清理一下代码。

即,您既不需要将成员变量声明为支持变量,也不需要声明合成语句。

如果你没有宣布合成你的自我,那么属性foo将具有支持变量_foo

所以这段代码应该可行

@interface BigLetterView : NSView 
@property (nonatomic, strong) NSColor *bgColor;
@end

@implementation BigLetterView
@synthesize bgColor = _bgColor;

- (void)setBgColor:(NSColor *)c 
{
    _bgColor = c;
    [self setNeedsDisplay:YES]; 
}
@end