我知道現代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