什么情况下会导致@属性不自动创建实例变量?

What are the circumstances that cause a @property to not automatically create an instance variable?

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

每当我在我们的项目中创建新的 类 时,我可以在不声明实例变量的情况下声明 @property BOOL testFlag。然后,在实现中,我可以调用 self.testFlag[self testFlag][self setTestFlag:NO]。但是,我也可以调用 _testFlag。我一直假设因为属性会自动与实例变量合成,这就是为什么我可以在 属性 名称前附加一个“_”下划线以直接访问实例变量。

但是,我一直在重构非常旧的文件,这些文件显然是在 auto-synthesizing 成为现实之前创建的

所以现在在 header 中,我会看到这样的内容:

@interface testClass 
{
  BOOL _testFlag
} 

@property BOOL testFlag;

在实现中,可以自定义setter/getter:

@implementation testClass

@synthesize testFlag = _testFlag;

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

-(BOOL)testFlag
{
  return _testFlag;
}

但我认为因为 auto-synthesizing,我可以删除 header 中的 _testFlag 声明,并且我可以删除实现中的 @synthesize。但是当我这样做时,只会出现一大堆错误;在任何有人直接尝试访问 ivar _testFlag 的地方。 (其实也包括上面的自定义getter/setter^^)

我在项目设置中是否遗漏了一些东西,阻止这个旧文件为属性生成一个隐含的实例变量?

删除 getter 和 setter 以自动合成支持变量。当您为 属性 提供两者时,假设您将自己照顾存储。