2009-10-16 33 views
3

爲什麼人們使用Objective-C:什麼是私人不是什麼?

@interface ViewController : UIViewController 
{ 
@private 
    UIButton* button_; 
} 

@private聲明公共標題?在實現中聲明變量會得到相同的結果,不是嗎?我感到很奇怪,我認爲公衆頭像應該只包含真正的公衆成員。如何處理受保護的成員?

@implementation ViewController 
    UIButton* button_; 
@end 

我所知道的唯一的區別是,這個變量只是在當前編譯單元內可見(.m文件,對不對?)

做同樣保持如此的方法呢?我可以通過正確的方法排序或轉發聲明進行編譯。爲什麼人們喜歡爲私人方法申報類別?僅用於測試目的?

回答

7

@implementation塊內的變量聲明將創建一個全局變量,而不是一個實例變量。實例變量需要定義爲@interface的一部分。

儘管可以通過類別或擴展名創建附加的@interface塊,但它只能包含方法聲明,而不能包含實例變量。

+0

這不是我所期望的!這是否意味着它們也是靜態的? – 2009-10-16 13:44:51

+0

我認爲它們不是,它只是一個用C語言來聲明事物的全局變量。請記住'Objective-C'是'C'的一個嚴格超集,所有'C'規則仍然適用。 – pgb 2009-10-16 13:54:16

+0

我已經確認它是一個全局變量,你我是對的。我很驚訝編譯器在聲明一個非靜態變量_inside_ @implementation – 2009-10-16 14:49:11

0

@private指的只是iVars。

默認情況下,你可以像這樣訪問實例的實例變量: - id iShouldNotDoThis = foo->bar;

@private意味着你不能訪問伊娃這樣的,必須使用訪問方法。

id thisIsBetter = [foo bar]; 

與私人類別或方法無關。

+0

不會讓我嘗試訪問button_如果它只是在實現文件內聲明時,編譯器/連接錯誤? – 2009-10-16 13:38:26

+0

它不在實現文件中..它在公共頭中,聲明@私人 – 2009-10-16 13:52:22

+0

對不起,我的意思是我的例子aboce,其中button_被聲明爲int實現文件 – 2009-10-16 13:57:19

4

我想說,雖然它可能「覺得」你錯誤的把私人實例變量放在一個所謂的公開頭文件中,但我不會擔心它。

看看Cocoa類的所有頭文件(羣集類除外),並且您會看到Apple在其公用頭文件中聲明瞭它們的實例變量。

由於蘋果公司對它有好處,我認爲你不需要擔心太多。 =)

供參考:所有實例變量默認保護。

3

對於方法也一樣嗎?

不,方法對於程序的任何部分都是可見的。如果你知道選擇你可以callit。

我可以很好地編譯正確的方法排序或轉發聲明。爲什麼人們喜歡爲私人方法申報類別?僅用於測試目的?

私人類別是前向聲明的一種形式。你可以把它們想象成C原型。

安德魯

相關問題