从 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
??
这一切都很奇怪。