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つの別々のファイルではなく、すべてを1つのファイルに移動すると、コンパイラーは代わりにそれ_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
これはすべて非常に奇妙です。