Какие обстоятельства приводят к тому, что @property не создает автоматически переменную экземпляра?

Я был в мире Objective-C и Какао только год, поэтому меня не было рядом, когда свойства не были автоматически синтезированы

Всякий раз, когда я создаю новые классы в нашем проекте, я могу объявить @property BOOL testFlag без объявления переменной экземпляра. Затем в реализации я мог бы позвонить self.testFlag, [self testFlag], [self setTestFlag:NO], Но я мог бы также позвонить _testFlag, Я всегда предполагал, что свойства автоматически синтезируются с переменными экземпляра, поэтому я могу просто добавить подчеркивание "_" перед именем свойства для прямого доступа к переменной экземпляра.

Тем не менее, я проводил рефакторинг действительно старых файлов, которые, очевидно, были созданы до того, как была произведена автосинтез

Так что теперь в шапке я бы увидел что-то вроде этого:

@interface testClass 
{
  BOOL _testFlag
} 

@property BOOL testFlag;

В реализации может быть пользовательский установщик / получатель:

@implementation testClass

@synthesize testFlag = _testFlag;

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

-(BOOL)testFlag
{
  return _testFlag;
}

Но я думал, что из-за автоматического синтеза, я мог бы удалить _testFlag объявление в заголовке, и я мог бы удалить @synthesize в реализации. Но когда я делаю это, возникает куча ошибок; везде, где кто-то пытался получить доступ к ивару _testFlag, (Это также включает в себя пользовательский метод получения / установки выше ^^)

Возможно, мне чего-то не хватает в настройках проекта, которые мешают этому старому файлу генерировать неявную переменную экземпляра для свойств?

1 ответ

Решение

Удалите геттер и сеттер для автоматического синтеза резервной переменной. Когда вы предоставляете оба объекта, предполагается, что вы сами позаботитесь о хранении.

Другие вопросы по тегам