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

Objective c 重新定义属性的setter时的无限循环,objective-c,properties,Objective C,Properties,在Mac OS X(Hillegass)的Cocoa编程中,第19章中有一个类: @interface BigLetterView : NSView { NSColor *bgColor; } @property (strong) NSColor *bgColor; @end 访问器的定义如下: - (void)setBgColor:(NSColor *)c { bgColor = c; [self setNeedsDisplay:YES]; } 这在我看来是正确的,但它创建了一个无限循环:

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

@interface BigLetterView : NSView {
NSColor *bgColor;
}
@property (strong) NSColor *bgColor;
@end
访问器的定义如下:

- (void)setBgColor:(NSColor *)c {
bgColor = c;
[self setNeedsDisplay:YES]; }
这在我看来是正确的,但它创建了一个无限循环:
bgColor=c
calls
setBgColor:c

这个代码正确吗


如何重新定义setter?编译这段代码需要什么

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

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

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

另外,制定一个简单的规则,在您使用self的任何其他地方始终将该属性与self一起使用。这只是一个更好的规则,可以让您更清楚地理解事情。

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

也就是说,既不需要将成员变量声明为支持变量,也不需要将合成语句声明为支持变量

如果你不去分解你自己,一个属性
foo
将有一个支持变量
\u 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

bgColor=c;
调用
setBgColor:c
”-不,它不是,您可能是指
self.bgColor=c…如果出现问题,请确保ivar的名称与属性不同。如果将bgColor用于属性,则将bgColor用于ivar。如果你想让我们帮你调试你的代码,那就给我们真正的狗屎吧。这肯定没有无限循环。可能您正在setter内将bgColor设置为
self.bgColor=c。还修复了格式!注意,声明synthesis不再需要了,成员的声明也不再需要了。是的,在较新的目标c中不需要,但实际上很容易理解正在发生的事情。Synthesis对原始属性和访问器变量做了什么属性foo的支持变量将以_foo.Ha Ha的形式提供,完成了。还有别的吗?如果您发现任何打字错误,请务必更正。我不是想展示新的更好的语法,只是想把想法付诸实践。但现在我有了:Setter和getter必须都是合成的,或者都是用户定义的,或者属性必须是非原子的。在这种情况下,BG的颜色会是什么样子_bgColor在两个函数中都变成了未声明的变量:-(NSColor*)bgColor{return\u bgColor;}不是真的:这是版本4.5.2(4G2008a)。您是使用llvm还是gcc编译的?我使用的是Apple llvm 4.1。我将尝试提取一个最小的代码来重现我所抱怨的内容,因为该代码是我编译和运行的实际代码,并且我没有使用self-dot-bgColor。不管怎样,我现在明白了。