如何覆盖@synthesized吸气剂?


75

如何重写属性合成的吸气剂?


2
这不是iPhone或iOS专用的。它甚至不特定于任何平台或框架。

“覆盖”在OOP和Objective-C中具有特定含义。las,您可能会说其他话:“如何防止合成吸气剂,而是手动实现它?” 如果我对您的解释正确,那么您确实接受了错误的答案。
Nikolai Ruhe 2015年

2
@ user142019:为什么这么重要?
Stewart Macdonald

Answers:


55

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

@property (nonatomic, retain, getter = getterMethodName, setter = setterMethodName) NSString *someString;

您可以仅指定getter,仅指定setter或同时指定两者。


如何指定仅getter /仅setter?
Pedro Rolo

在我的Xcode项目中,不需要@synthesize someString,在这种情况下,如何设置其值?Xcode错误表示这是一个未声明的属性。.Thx
Frank先生,

5
@ Mr.Frank:现在,Xcode默认情况下自动进行属性的合成。这是在Xcode版本(4.5?)中添加的。因此,基本上,您不必再使用@synthesize变量了,只需要使用@property,就可以在其中指定getter和/或setter。
matsr

76

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

- (BOOL)myBoolProperty
{
    // do something else
    ...
    return myBoolProperty;
}

这样,编译器将不会生成getter方法。


12
请注意,如果您@propertyatomic(默认值),则无法正确地将@synthesized getter / setter与手动编写的getter / setter混合使用。
bbum

12
怕什么? atomic那么有用;它并不能保证线程化应用程序中的数据完整性。它只是防止应用因明显的竞争状况而崩溃。如果您atomic
过分

2
@bbum:当属性是原子属性时,您能否详细说明“不能正确地将合成的getter / setter与手动编写的getter / setter混合使用”的含义?我不明白彼此之间有什么关系。谢谢。
Ole Begemann

6
当然; stackoverflow.com/questions/588866/…可能会有所帮助。特别是,由于atomic未公开要实现的锁定机制,因此您无法手动仅实现setter或仅实现getter并确保使用@synthesized atomicsetter / getter的原子性。
bbum

1
如果编写这样的getter方法,该属性会自动变为只读状态吗?如果没有,如果为属性分配了值,数据将存储在哪里?
matthias_buehlmann 2014年

43

只要实现自己的getter,编译器就不会生成一个。二传手也一样。

例如:

@property float value;

等效于:

- (float)value;
- (void)setValue:(float)newValue;

10

我只想添加,直到我添加以下代码,我才能使用getter / setter覆盖BOOL属性:

@synthesize myBoolProperty = _myBoolProperty;

所以完整的代码是:

在头文件中:

@property  BOOL myBoolProperty;

在执行文件中:

@synthesize myBoolProperty = _myBoolProperty;


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

-(BOOL) myBoolProperty
{
    return _myBoolProperty;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.