2010-06-03 31 views
1

的合成屬性我有一種情況,我的子類沒有看到超類的實例變量x。伊娃顯然是默認@protected,所以爲什麼我會得到一個編譯器錯誤「x undeclared」?協議沒有看到父類'ivar

- (CGSize)hitSize 
{ 
    // Compiler error 
    return size; 
} 

編輯:hitSize是我的子類符合協議的屬性。問題是我已經打到尺寸爲@synthesized,這是罪魁禍首。那麼問題是爲什麼綜合得分手不能看到伊娃?

編輯:現在,我發現了這個問題,我編輯了問題,問爲什麼這是一個錯誤。

+0

也許有一箇舊的對象文件的地方?清理和重建問題是否會消失? – 2010-06-03 05:05:51

+0

不,清潔和構建沒有幫助。 – Morrowless 2010-06-03 05:06:56

+0

向我們展示一些代碼? – 2010-06-03 05:09:34

回答

3

Joanna的答案都是正確的(雖然伊娃合成不踢上32位Mac OS X)。

原因是,因爲允許子類綜合訪問超類的內部狀態將會明顯地破壞封裝。在所有情況下,即使在單一框架內,都做出了明確不允許該特定模式的決定。

如果超類爲某些東西提供存儲,它應該提供訪問控制並封裝所述內存的管理。如果一個子類需要定製訪問權限,可以通過重寫getter/setter [並且最好調用super來實際獲取/設置值]來小心執行。

1

合成屬性不僅合成了吸氣劑和吸氣劑,還合成了伊娃如果沒有聲明。

您需要在子類中編寫顯式訪問器,並通過self> myIvar語法訪問@保護的ivar。

+0

我建議不要這種模式,只是因爲在super和subclass中有相同名字的iVars會令人困惑! – bbum 2010-06-03 07:06:25

2

您也可以使用顯式的getter/setter屬性來訪問,即使基類的@private高德:

 

@interface Base : NSObject 
{ 
    @protected 
    int intVar; 
} 

@end 

@interface Derived : Base 
{ 
} 

@property (assign, getter = intVar, setter = intVar) int aVar; 

@end 

1

非常感謝bbum對我的回覆進行了詳細說明。

關於你的第二個回覆,你當然權利,在這種情況下,你可以在「做正確的事情」,使用類擴展到隱藏在基類中的屬性,像這樣:

 
// Example.h 
@interface Base : NSObject 
{ 
    @private 
    int intVar; 
} 

@end 

@interface Derived : Base 
{ 
} 

@property (assign) int aVar; 

@end 
 
// Example.m 
@interface Base() 

@property (assign) int intVar; 

@end 

@implementation Base 

@synthesize intVar; 

@end; 

@implementation Derived 

- (int) aVar 
{ 
    return self.intVar; 
} 

- (void) setAVar:(int)value 
{ 
    self.intVar = value; 
} 

@end 
相關問題