Я не могу получить доступ к переменным-членам подкласса после отправки объекта в качестве суперкласса. Функции членов работают. Смотрите этот пример:Не удается получить доступ к элементам подкласса после отправки в качестве суперкласса
определение супер класс
@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 (nonatomic, assign) для всех членов. Отладчик показывает мне правильный адрес для stringDerived, но это «вне сферы действия».
Кто-нибудь знает, в чем причина такого поведения?
Спасибо, Rodo
введите код, в котором вы инициализируете переменную anotherString1, – Robin
Если вы измените свойства на (неатомные, сохраняйте), произойдет ли сбой? – fbrereto
@robin Спасибо за ваш ответ. Все строки инициализируются одинаково ([NSString stringWithFormat: @ "..."]). Они исходят от обратного вызова делегата. – user602313