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
これはすべて非常に奇妙です。