我只参加过Objective-C&可可世界一年,所以当我没有自动合成属性时我不在身边
每当我在项目中创建新类时,我都可以在不声明实例变量的情况下声明@property BOOL testFlag
。然后,在实施中,我可以拨打self.testFlag
,[self testFlag]
,[self setTestFlag:NO]
。但是,我也可以打电话给_testFlag
。我总是假设因为属性是使用实例变量自动合成的,这就是为什么我可以在属性名称之前附加“_”下划线来直接访问实例变量。
然而,我一直在重构真正的旧文件,这显然是在自动合成之前创建的
现在在标题中,我会看到类似的内容:
@interface testClass
{
BOOL _testFlag
}
@property BOOL testFlag;
在实现中,可能有自定义setter / getter:
@implementation testClass
@synthesize testFlag = _testFlag;
-(void)setTestFlag:(BOOL)testFlag
{
_testFlag = testFlag;
}
-(BOOL)testFlag
{
return _testFlag;
}
但我想因为自动合成,我可以删除标头中的_testFlag
声明,我可以删除实现中的@synthesize
。但是当我这样做时,只有一大堆错误;只要有人直接试图访问ivar _testFlag
。 (这实际上也包括^^以上的自定义getter / setter)
项目设置中是否可能存在一些阻止此旧文件为属性生成隐含实例变量的内容?
答案 0 :(得分:2)
删除getter和setter以自动合成支持变量。当您为房产提供两者时,假设您将自己照顾存储。