Следующее кажется достаточно простым. Есть суперкласс с ivar и подкласс, который обращается к ivar суперклассов (@protected):
// 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 суперкласса.
Может ли кто-нибудь просветить меня относительно того, что здесь происходит? Соответственно, можно ли было предвидеть ошибку компиляции? (Предвидение этого сэкономило бы мне время и нервы).