Я думаю, что это ошибка GCC 4.2.1.Я создал файл foo.m
с содержимым
#import <Foundation/Foundation.h>
@interface TestA : NSObject {
NSString *testString;
}
@end
@implementation TestA
@end
@interface TestB : TestA {
}
@property (retain) NSString *testProp;
@end
@implementation TestB
@synthesize testProp;
- (void)testing{
NSLog(@"test ivar is %@", testString);
}
@end
. Обратите внимание, что в 64-битном режиме можно пропустить переменную экземпляра.Мой GCC 4.2.1 на OS X 10.6.3 дал мне ошибку:
$ gcc -arch x86_64 -c foo.m
aho.m: In function ‘-[TestB testing]’:
aho.m:19: error: ‘testString’ undeclared (first use in this function)
aho.m:19: error: (Each undeclared identifier is reported only once
aho.m:19: error: for each function it appears in.)
Это скомпилировано без проблем, изменив
NSLog(@"test ivar is %@", testString);
на
NSLog(@"test ivar is %@", self->testString);
Clang скомпилировал его без проблем.
(В 32-битном режиме я получил
$ gcc -arch i386 -c foo.m
aho.m:17: error: synthesized property ‘testProp’ must either be named
the same as a compatible ivar or must explicitly name an ivar
aho.m: In function ‘-[TestB testing]’:
aho.m:19: error: ‘testString’ undeclared (first use in this function)
aho.m:19: error: (Each undeclared identifier is reported only once
aho.m:19: error: for each function it appears in.)
, что, как писал Манджунатх, вполне ожидаемое поведение.)
Однако Я думаю, что, как правило, довольно плохая идея получить доступ к переменной экземпляра суперкласса: когда вы реализуете методы суперкласса, вы не можете предполагать что-либо о переменной экземпляра, потому что она может быть изменена худшим способом,подкласс.По крайней мере, вам нужно записать, какая операция с переменной экземпляра разрешена или нет ... Помните, что вам может потребоваться поддерживать ваш код годами!Я бы предпочел хранить контракты на программирование между различными частями кода на уровне методов и свойств.
Наконец, вы должны изменить
@property NSString *testProp;
на
@property (copy) NSString *testProp;
илипо крайней мере до
@property (retain) NSString *testProp;
, если вы не используете GC на OS X. В противном случае EXP_BAD_ACCESS будет ждать вас!