Подтвердить что ты не робот

Почему подкласс @property без соответствующего ivar скрывает суперкары ivars?

Следующее выглядит достаточно простым. Там суперкласс с 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.

Может ли кто-нибудь просветить меня о том, что происходит здесь? Связано ли это с предсказанием компиляции? (Предвидя, это спасло бы меня некоторое время и разочарование).

4b9b3361

Ответ 1

LLVM компилирует источник без жалоб, переключается на LLVM: выберите цель → Получить информацию → Сборка → Версия компилятора C/С++ → LLVM 1.5. В моем ограниченном опыте его лучший компилятор в любом случае. Не знаю, почему GCC ведет себя так, как это делает - интересный улов.

Ответ 2

Необработанная ошибка testIvar на самом деле является красной селедкой в ​​этом случае. Это сообщение, похоже, вызвано тем, что testProperty не имеет соответствующего ivar. Чтобы решить проблему, либо объявите testarper testProperty в TestSubClass.h, либо создайте testProperty @dynamic в TestSubClass.m.