为 BOOL 变量编写 getter 和 setter

9
显然,使用Obj-C时,通常没有必要编写getter和setter(感谢有用的mr @synthesize)。
现在,我需要做的就是编写它们,但我不知道该如何编写。:p 我相信我可能没有以正确的方式解决我的问题 - 只需子类化对象等方法会更容易 - 但我正在尝试编写类别代码来添加属性,因为(最初)这样更快,并且我想学习如何在我的应用程序中使用类别代码。
我有以下代码:
-(BOOL)isMethodStep {
    return self.isMethodStep;
}

-(void)setIsMethodStep:(BOOL)theBoolean {
    if(self.isMethodStep != theBoolean){
        self.isMethodStep = theBoolean;
    }
}

我尝试过在setter中不使用if查询语句来运行代码,但似乎都没有起作用。通过断点加载它可以显示某些原因导致getter方法中出现了连续循环。

这段代码是否正确?还是我做错了什么?

谢谢, Tom

2个回答

12

In

-(BOOL)isMethodStep {
    return self.isMethodStep;
}

return self.isMethodStep;调用相同的isMethodStep方法,导致无限循环。setter也是一样的。

在访问器方法实现中直接使用您的iVars:

-(BOOL)isMethodStep {
    return isMethodStep;
}

-(void)setIsMethodStep:(BOOL)theBoolean {
    if(isMethodStep != theBoolean){
        isMethodStep = theBoolean;
    }
}

是的,我明白了。:) 但是,我该如何阻止这种情况发生?我该如何编写它们? - Thomas Clayson
-(BOOL)isMethodStep { return isMethodStep; } -(BOOL)是方法步骤吗 { 返回是方法步骤吗; } - superfell
我编辑了我的回答,我认为方法应该看起来就像这样(如果您不关心原子性,我在线程问题方面不是很擅长...) - Vladimir

5

在setter/getter中,您不应该使用self.属性语法,因为这会再次调用setter/getter,而不是直接分配给变量。

您只需要说:

-(BOOL)isMethodStep {
    return isMethodStep;
}

-(void)setIsMethodStep:(BOOL)theBoolean {
    isMethodStep = theBoolean;
}

(假设“isMethodStep”是您的变量名称)。我也会在setter方法中省略测试...

1
我明白 isMethodStep 未声明。 :/ - Thomas Clayson
1
相同的问题。将“_isMethodStep”放置。 - WebOrCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接