Начиная с xcode 4.4 вам больше не нужны свойства @synthesize
(см. здесь), компилятор сделает это за вас. Итак, почему компилятор жалуется
использование необъявленного идентификатора _aVar
в моем viewDidLoad
методе ViewControllerSubclass
:
@interface ViewController : UIViewController
@property (assign, nonatomic) int aVar;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.aVar = 5;
NSLog(@"Super value: %d", _aVar);
}
@end
@interface ViewControllerSubclass : ViewController
@end
@interface ViewControllerSubclass ()
@property (assign, nonatomic) int aVar;
@end
@implementation ViewControllerSubclass
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Subclass value: %d", _aVar);
}
@end
Если я перемещаю все в один файл вместо 4 отдельных файлов для соответствующих интерфейсов и реализаций, компилятор вместо этого жалуется, что _aVar
является закрытым. Но _aVar должен был быть автоматически синтезирован в моем ViewControllerSubclass
.
Все еще сохраняя все в 1 файле, если я перенесу начальное объявление свойства в расширение класса:
@interface ViewController ()
@property (assign, nonatomic) int aVar;
@end
Сборка по-прежнему не работает, говоря, что _aVar
является закрытым.
Если я вернусь к настройке 4 файлов для соответствующих интерфейсов и реализаций, xcode строит даже без предупреждения.
Если я затем запускаю код:
[[[ViewControllerSubclass alloc] init] view];
операторы журнала в приведенных выше примерах выводят следующее:
Супер ценность: 0
Значение подкласса: 5
Имеет смысл, что NSLog(@"Super value: %d", _aVar);
дал результат 0
, поскольку предполагается, что эта переменная является частной для суперкласса. Но тогда почему NSLog(@"Subclass value: %d", _aVar);
дает результат 5
??
Все это очень странно.