更新 - 多くの人が、プロパティの iVar を宣言する必要があると主張しています。私は最新のランタイム (64 ビット) を使用しているため、そうではないという人もいます。@property を iVar なしで何ヶ月も正常に使用していることを確認できます。したがって、「正しい」答えは、64ビットで、子クラスからアクセスするときに(そしてそのときにのみ)iVarを明示的に宣言する必要がある理由についての説明だと思います。これまでに見た唯一のバグは、GCC のバグの可能性です (Yuji さんに感謝します)。結局のところ、それほど単純ではありません...考えられるバグを明確にするために、次のようにします。基本クラスから継承する場合、子は親の iVar IF にアクセスできません。その子は、iVar にアクセスする前に @synthesize を使用して UNRELATED アクセサーを実装することもあります。
私はこれで数時間頭を悩ませてきました - 私は継承をあまり使っていません。
ここでは、ivar が宣言されているテスト A から継承する単純なテスト B クラスをセットアップしました。しかし、変数が宣言されていないというコンパイルエラーが発生します。これは、プロパティを追加して宣言を合成した場合にのみ発生します - それらがなくても正常に動作します。
TestA ヘッダー:
#import <Cocoa/Cocoa.h>
@interface TestA : NSObject {
NSString *testString;
}
@end
TestA 実装は空です:
#import "TestA.h"
@implementation TestA
@end
TestB ヘッダー:
#import <Cocoa/Cocoa.h>
#import "TestA.h"
@interface TestB : TestA {
}
@property (nonatomic, retain) NSString *testProp;
@end
TestB の実装 (エラー - 'testString' が宣言されていません)
#import "TestB.h"
@implementation TestB
@synthesize testProp;
- (void)testing{
NSLog(@"test ivar is %@", testString);
}
@end