Обновление. Многие люди настаивают, что мне нужно объявить iVar для этого свойства. Некоторые говорят не так, поскольку я использую Modern Runtime (64 бит). Я могу подтвердить, что я успешно использовал @property без iVars уже несколько месяцев. Поэтому я считаю, что "правильный" ответ объясняет, почему на 64-битном я вдруг должен явно объявить iVar, когда (и только когда) я собираюсь получить к нему доступ из дочернего класса. Единственный, который я видел до сих пор, - это возможная ошибка GCC (спасибо Юдзи). Не так просто в конце концов... Чтобы прояснить возможную ошибку, выполните следующее: При наследовании от базового класса ребенок не может получить доступ к родительскому iVar IF, если дочерний объект также реализует UNRELATED-аксессуар, используя @synthesize ПЕРЕД тем, к которому обращается iVar.
Я уже несколько часов царапаю голову этим, я не использовал наследование много.
Здесь я установил простой класс теста B, который наследуется от теста A, где объявлен ivar. Но я получаю ошибку компиляции, что переменная не объявлена. Это происходит только тогда, когда я добавляю свойство и синтезирую декларации - отлично работает без них.
Заголовок TestA:
#import <Cocoa/Cocoa.h>
@interface TestA : NSObject {
NSString *testString;
}
@end
TestA Реализация пуста:
#import "TestA.h"
@implementation TestA
@end
Заголовок TestB:
#import <Cocoa/Cocoa.h>
#import "TestA.h"
@interface TestB : TestA {
}
@property (nonatomic, retain) NSString *testProp;
@end
Реализация TestB (ошибка - "testString" не объявлена)
#import "TestB.h"
@implementation TestB
@synthesize testProp;
- (void)testing{
NSLog(@"test ivar is %@", testString);
}
@end