Следующее выглядит достаточно простым. Там суперкласс с ivar и подкласс, который обращается к (@защищенным) суперклассам ivar:
// Testclass.h
@interface TestClass : NSObject {
NSString *testIvar;
}
@end
//TestClass.m
@implementation TestClass
@end
//TestSubclass.h
@interface TestSubClass : TestClass {
}
@property (nonatomic, retain) NSString *testProperty;
- (void) testMethod;
@end
//TestSubclass.m
#import "TestSubClass.h"
@implementation TestSubClass
@synthesize testProperty;
- (void) testMethod{
NSLog(@"The value was: %@", testIvar);
}
@end
Простая и правильная, кажущаяся достаточно. Однако попытка скомпилировать (для iOS 4.2 SDK с GCC 4.2) вызывает эту ошибку, указывающую на строку NSLog: "testIvar undeclared".
Я новичок в Objective-C, но не могу в жизни меня понять, почему это должно быть ошибкой. Прокомментируйте материал testProperty, и он компилирует ОК. Похоже, что добавление синтетического свойства в подкласс, без соответствующего ivar, фактически скрывает несвязанный надкласс ivar.
Может ли кто-нибудь просветить меня о том, что происходит здесь? Связано ли это с предсказанием компиляции? (Предвидя, это спасло бы меня некоторое время и разочарование).