我知道现代Objective-C运行时可以合成ivars。我认为合成的ivars的行为与标记为@private
的声明的ivars完全相同,但它们没有。声明的私有ivars与合成的ivars有什么不同?
因此,只有在我期望可以工作的现代运行时才能编译代码。例如,超:
@interface A : NSObject {
#if !__OBJC2__
@private
NSString *_c;
#endif
}
@property (nonatomic, copy) NSString *d;
@end
@implementation A
@synthesize d=_c;
- (void)dealloc {
[_c release];
[super dealloc];
}
@end
和子类:
@interface B : A {
#if !__OBJC2__
@private
NSString *_c;
#endif
}
@property (nonatomic, copy) NSString *e;
@end
@implementation B
@synthesize e=_c;
- (void)dealloc {
[_c release];
[super dealloc];
}
@end
子类不能有相同名称的声明伊娃作为其超类的一个声明实例变量,即使父类的伊娃是私人的。在我看来,这似乎违反了@private
的含义,因为子类受到超类对隐私的选择的影响。
然而,我更关心的是我应该如何考虑合成ivars。我认为他们表现得像宣布的私人ivars,但没有脆弱的基础类问题。也许这是对的,我只是不理解脆弱的基类问题。为什么上述代码仅在现代运行时中编译?当所有超类实例变量都是私有的时候,脆弱的基类问题是否存在?
啊,所以在声明private private ivars时会出现同样的问题:'B.h'导入'A.h',声明'_c'。随后对“_c”的引用将被解释为对“A :: _ c”的引用,而不是未声明的标识符。这是有道理的,尽管它似乎仍然是错误的。我希望符号的范围仅限于超类,并且它将被视为在其他地方未声明。 – lemnar 2010-03-22 06:37:32