Почему подкласс @property без соответствующего ivar скрывает суперкласс ivar? - PullRequest
12 голосов
/ 18 октября 2010

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

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

Ответы [ 2 ]

7 голосов
/ 18 октября 2010

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

1 голос
/ 01 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...