スーパークラスとしてオブジェクトを送信した後、サブクラスのメンバー変数にアクセスすることはできません。メンバー関数が機能しています。この例を参照してください:スーパークラスとして送信した後、サブクラスのメンバーにアクセスできない
スーパークラス定義
@interface SuperClass : NSObject {
NSString *stringSuper;
NSInteger intSuper;
}
- (void)test; // NSLog(@"test: SuperClass");
派生クラス定義
@interface DerivedClass : SuperClass {
NSString *stringDerived;
NSInteger intDerived;
}
- (void)test; // NSLog(@"test: DerivedClass");
- (void)test1; // NSLog(@"test1: DerivedClass");
へキャストした後のアクセスのメンバーにしてみてくださいDerivedClassオブジェクトを作成し、スーパークラス
DerivedClass *d = [[DerivedClass alloc] init];
d.stringSuper = anotherString;
d.intSuper = anotherInt;
d.stringDerived = anotherString1;
d.intDerived = anotherInt1;
[anObject sendMessage:d];
として送信DerivedClass
- (void)sendMessage:(SuperClass *)s {
DerivedClass *d = (DerivedClass *)s;
NSLog(@"%@", d.stringSuper); // ok
NSLog(@"%d", d.intSuper); // ok
NSLog(@"%@", d.stringDerived); // EXC_BAD_ACCESS
NSLog(@"%d", d.intDerived); // ok
[d test]; // ok ("test DerivedClass")
[d test1]; // ok ("test1 DerivedClass")
}
私はすべてのメンバーに対して@properties(非原子、代入)を宣言しました。デバッガは、stringDerivedの正しいアドレスを表示しますが、「範囲外です」。
誰もがこの動作の理由を知っていますか?
おかげで、RODO
anotherString1変数 – Robin
を初期化したコードを投稿する(非原子的、保持)にプロパティを変更すると、クラッシュは消えますか?返信いただきありがとうございます。 – fbrereto
@robinすべての文字列は同じ方法で初期化されます([NSString stringWithFormat:@ "..."])。彼らはデリゲートのコールバックから来ます。 – user602313