Какие обстоятельства приводят к тому, что @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 ответ
Удалите геттер и сеттер для автоматического синтеза резервной переменной. Когда вы предоставляете оба объекта, предполагается, что вы сами позаботитесь о хранении.