【发布时间】:2011-06-21 05:07:40
【问题描述】:
将对象作为超类发送后,我无法访问子类的成员变量。成员函数正在工作。看这个例子:
超类定义
@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 对象并作为 SuperClass 发送
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 的正确地址,但它“超出范围”。
有人知道这种行为的原因是什么吗?
谢谢,罗多
【问题讨论】:
-
发布初始化 anotherString1 变量的代码,
-
如果将属性更改为 (nonatomic, retain) 崩溃会消失吗?
-
@robin 感谢您的回复。所有字符串都以相同的方式初始化([NSString stringWithFormat:@"..."])。它们来自委托的回调。
-
为了记录,在 Objective-C 的说法中,这些是 instance 变量。
-
@fbrereto 感谢您的重播。我已经尝试过这个 - (非原子,保留)的相同行为。
标签: objective-c subclass member