Objective c 是什么情况导致@property无法自动创建实例变量?

Objective c 是什么情况导致@property无法自动创建实例变量?,objective-c,properties,synthesize,Objective C,Properties,Synthesize,我只在Objective-C&Cocoa世界呆了一年,所以当属性没有自动合成时,我不在身边 每当我在项目中创建新类时,我都可以声明@property BOOL testFlag,而无需声明实例变量。然后,在实现中,我可以调用self.testFlag,[self-testFlag],[self-setTestFlag:NO]。但是,我也可以调用\u testFlag。我总是假设,因为属性是自动与实例变量合成的,所以我可以在属性名称前加一个“ux”下划线,直接访问实例变量 然而,我一直在重构非常旧

我只在Objective-C&Cocoa世界呆了一年,所以当属性没有自动合成时,我不在身边

每当我在项目中创建新类时,我都可以声明
@property BOOL testFlag
,而无需声明实例变量。然后,在实现中,我可以调用
self.testFlag
[self-testFlag]
[self-setTestFlag:NO]
。但是,我也可以调用
\u testFlag
。我总是假设,因为属性是自动与实例变量合成的,所以我可以在属性名称前加一个“ux”下划线,直接访问实例变量

然而,我一直在重构非常旧的文件,这些文件显然是在自动合成之前创建的

现在在标题中,我看到如下内容:

@interface testClass 
{
  BOOL _testFlag
} 

@property BOOL testFlag;
在实现中,可能有一个自定义setter/getter:

@implementation testClass

@synthesize testFlag = _testFlag;

-(void)setTestFlag:(BOOL)testFlag
{
  _testFlag = testFlag;
}

-(BOOL)testFlag
{
  return _testFlag;
}
但是我认为由于自动合成,我可以删除头中的
\u testFlag
声明,并且可以删除实现中的
@synthesis
。但当我这样做的时候,只会有一卡车吨的错误;当有人直接试图访问ivar
\u testFlag
时。(这实际上也包括上面的自定义getter/setter^)


项目设置中是否有我缺少的东西阻止这个旧文件为属性生成隐含的实例变量?

删除getter和setter以自动合成支持变量。当您为属性同时提供这两个属性时,假设您将自己负责存储。

理解自动合成属性的关键是认识到编译器将只合成未显式实现的属性。当您同时实现getter和setter时,就没有什么需要合成的了,所以编译器什么也不做。完全有意义。谢谢很抱歉,我没有找到明显重复的问题--应该是“删除getter或setter…”