【发布时间】:2015-11-20 16:07:13
【问题描述】:
我只在 Objective-C 和 Cocoa 领域工作了一年,所以当属性没有自动合成时,我不在身边
每当我在项目中创建新类时,我都可以声明 @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 ^^)
我的项目设置是否可能缺少一些东西,阻止这个旧文件为属性生成隐含的实例变量?
【问题讨论】:
-
理解自动综合属性的关键是认识到编译器只会综合那些没有明确实现的东西。当你同时实现 getter 和 setter 时,就没有什么要合成的了,所以编译器什么也不做。
-
完全有道理。谢谢!抱歉,我没有找到明显重复的问题-.-
标签: objective-c properties synthesize