如何覆盖@synthesized getters?

Sim*_*ico 73 iphone objective-c ios

如何覆盖属性合成的getter?

Ole*_*ann 74

只需手动实现该方法,例如:

- (BOOL)myBoolProperty
{
    // do something else
    ...
    return myBoolProperty;
}
Run Code Online (Sandbox Code Playgroud)

然后编译器不会生成getter方法.

  • 请注意,如果您的`@ property`是`atomic`(默认值),则无法将`@ synthesize`d getter/setter与手动编写的getter/setter正确混合. (12认同)
  • 怕什么?`atomic`不是*那个有用的; 它无法保证线程应用程序中的数据完整性.它只是防止应用程序因明显的竞争条件而崩溃.如果你严重依赖`atomic`,你几乎肯定做错了...... :) (12认同)
  • 当然; http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties可能会有所帮助.具体来说,由于没有公开实现`atomic`的锁定机制,你无法手动实现setter或只是getter并使用`@ synthesize`d` atomic` setter/getter来确保原子性. (6认同)
  • @bbum:你可以详细说明你的意思是"你不能正确地将合成的getter/setter与手动编写的getter/setter混合"属性是原子的吗?我不明白与另一个人有什么关系.谢谢. (2认同)

小智 54

在属性定义中,您可以指定getter和setter方法,如下所示:

@property (nonatomic, retain, getter = getterMethodName, setter = setterMethodName) NSString *someString;
Run Code Online (Sandbox Code Playgroud)

您可以仅指定getter,仅指定setter或两者.

  • @Fr.Frank:Xcode现在默认自动合成属性.这是在一个Xcode版本(4.5?)中添加的.所以,基本上,你不再需要`@ synthesize`你的变量,你只需要`@ property`,在那里你只需要指定你的getter和/或setter. (5认同)

ste*_*anB 43

只需实现自己的getter,编译器就不会生成一个.对于二传手也是如此.

例如:

@property float value;
Run Code Online (Sandbox Code Playgroud)

相当于:

- (float)value;
- (void)setValue:(float)newValue;
Run Code Online (Sandbox Code Playgroud)


use*_*951 10

我只想添加,我无法用getter/setter覆盖BOOL属性,直到我添加:

@synthesize myBoolProperty = _myBoolProperty;
Run Code Online (Sandbox Code Playgroud)

所以完整的代码是:

在头文件中:

@property  BOOL myBoolProperty;
Run Code Online (Sandbox Code Playgroud)

在实施文件中:

@synthesize myBoolProperty = _myBoolProperty;


-(void)setMyBoolProperty:(BOOL) myBoolPropertyNewValue
{
    _myBoolProperty = myBoolPropertyNewValue;
}

-(BOOL) myBoolProperty
{
    return _myBoolProperty;
}
Run Code Online (Sandbox Code Playgroud)