2014-05-22 50 views

回答

3

甚至還有第三個地方,你可以定義實例變量:在執行語句:

@implementation ViewController { NSString *yetAnotherString; } 

AFAIK,在古時候,你可以只定義在主界面的實例變量。其他兩個地方稍後添加。您也可以將它們混合(只要它們具有不同的名稱)。

定義變量@implementation和類擴展@interface ViewController()級別(在.m文件中完成時)的優點是您可以隱藏API用戶的實現細節。換句話說,如果有人讀取.h文件,他不知道變量。這使得可見的API更清晰,並且也是一種名爲「信息隱藏」的概念,這在面向對象編程中非常重要:不要公開太多的實現細節,因此您可以更改實現而不破壞使用該類的代碼。

請注意,您也可以在所有三個級別定義IBOutlet變量,Interface Builder將檢測並使用它們!

因此,當您決定在哪裏定義變量時,您可以簡單地問自己:其他人在看到.h文件時是否需要查看變量?恕我直言,這隻有當你需要/想要使一個變量@public真實。對於所有其他情況,您可以在類擴展或實現級別定義它們以使API更清潔。

1

無論你在ViewControllerA.H聲明是公共。這意味着包含ViewControllerA對象的其他視圖控制器可以直接訪問方法或變量。無論你在.M私有,其他視圖控制器不能立即訪問它。

至於我自己的做法,大部分變量(我沒有使用太多)或我在.M中聲明的屬性,以防止其他視圖控制器直接訪問它。它就像面向對象編程 - 數據封裝中的一個概念。

注:請提醒的是,這不應該與@public@protected@private像DarkDust下文提到的混淆。這將是另一個不同的話題。

+1

這幾乎是我所做的。 +1 – CW0007007

+2

請注意,上下文中的「public」不會自動引用變量訪問限制 - 默認情況下它們是「@ protected」,除非標記爲「@ public」。 – DarkDust

+0

@DarkDust感謝您的提醒。我會在上面添加更多信息。 – Ricky

0

在您在.h文件中聲明成員時,在Objective-C中,當.h文件導入爲標頭時,它對另一個文件變得可見。

默認情況下,所有成員變量都是私有的。所以,用戶不能直接使用它們。但是使用runtime.h和setValueForKey方法給它們設置這些變量的替代方法。

爲了避免用戶做這樣的惡作劇,建議在.m文件中聲明你的私有變量。它們也被稱爲擴展。

例如,您在appdelegate文件中創建了一個變量。現在將appdelegate.h文件導入到其他.m文件。通過sharedApplication委託獲取appdelegate的實例。現在您可以通過以下方式設置值。

[appdelegate setValue:your_value forKey:@"name of variable"]; 

雖然它是私人的,但用戶可以這樣做。這是因爲當你檢查自動建議窗口時,它會通過檢查列出你的私有變量。爲了避免在這個窗口中獲取這些變量,建議在.m文件中聲明它們。

+0

微調:默認情況下,實例變量是'@ protected'。 – DarkDust

相關問題