2012-02-11 72 views
4

由於iOS最近的運行時間,我們能夠定義將生成實例變量訪問器的屬性。根據我的理解,聲明所使用的實例變量並不是強制性的,因爲它會自動爲我們完成。合成的實例變量生成爲私有而不是受保護的嗎?

例如,如果我寫的:

@interface MyFirstClass 
@property (readonly, nonatomic) int size; 
@end 

,並在.M

@implementation MyFirstClass 
@synthesize size; 
@end 

那麼,「大小」將被添加爲我和一個叫方法「命名實例變量 - ( int)size「將被執行。

的問題是,當我創建第二類MySecondClass這是MyFirstClass的子類,似乎我不能這樣子類中訪問實例變量的大小:

@interface MySecondClass : MyFirstClass 
@end 

@implementation MySecondClass 
- (id)init { 
    if (self = [super init]) { 
     size = 10; // this yields and error 
    } 
    return self; 
} 
@end 

是自動創建的實例變量私有?是否有可能將它們設置爲受保護狀態,以便我可以在子類中訪問它們? 我知道有聲明的實例變量自己的可能性,但我只是想知道...

有了這樣的超它的工作原理:(是不是因爲受保護它明確宣佈?)

@interface MyFirstClass { 
    int size; // defined expressly and used as @protected 
} 
@property (readonly, nonatomic) int size; 
@end 

謝謝你的幫助! Nicolas。

回答

3

未在主界面中聲明的任何實例變量都自動爲私有的,並且不能被覆蓋。如果在實現中定義實例變量時嘗試使用範圍修飾符,則會出現規格不一致的錯誤。

原因是每個實現文件通常只有一個類,這意味着編譯器在編譯其他類時不知道實例變量。如果你在同一個文件中有多個類,編譯器可以知道它,但你仍然不允許覆蓋範圍。在這種情況下可能的原因可能是爲了保持一致性,或者只是爲了讓編譯器不必在實例變量的許多位置查找。

+0

好吧,這意味着我必須在界面中聲明變量以便能夠直接在子類中訪問它,對吧? 自動創建的實例變量實際上是私有的。 – 2012-02-11 23:19:22

+0

對。這是編譯器查找超類實例變量的唯一地方。 – ughoavgfhw 2012-02-11 23:20:42

0

用途:

self.size = 10; 

這將映射到setSize方法相似。

+1

我認爲它不會工作,因爲我沒有問過setter,我是對的?謝謝。 – 2012-02-11 23:02:01

+0

setter僅當您想要將默認設置器更改爲使用其他名稱或其他變量名稱時纔有效。嘗試一下! – Rayfleck 2012-02-11 23:08:09

+0

對不起,我不明白。我不想要任何公共二傳手,這應該是一個受保護的變量。你能澄清嗎? – 2012-02-11 23:11:49

相關問題