2012-03-22 67 views
3

我有疑問。它對我來說並不明顯。Objective-C命名約定 - 澄清

比方說,我們有一個@特性命名爲myProperty在類中。綜合它時我們可以做兩件事。或者我們可以指定一個伊娃,說_someIVar,給它,或者我們可以只是簡單地忽略它在這種情況下,編譯器負責使用相同的名稱創建一個伊娃的,myProperty的,該屬性。在第一種情況下,我們可以使用ivar_someivar進入酒店。在第二種情況下,我們可以使用伊娃這是由編譯器爲我們創造myProperty的

現在我的疑問是,當我們從一個視圖控制器,它已經在導航堆棧,我們使用,

[self.navigationController pushViewController:newViewController animated:YES]; 

由於navigationController是一個屬性推另一個視圖控制器,我認爲它應該分配給它一個ivar。只有兩種可能性。

1)首先是蘋果公司命名的ivars與前面的下劃線(_)。如果是這樣的話,我可以叫pushViewController:動畫:方法就是這樣,

[_navigationController pushViewController:newViewController animated:YES]; 

2)第二種可能性,顯然是沒有下劃線的伊娃,

[navigationController pushViewController:newViewController animated:YES]; 

但是,編譯不允許我以任何方式訪問navigationController。爲什麼?那是與私有財產有關的東西嗎?或者我根本不理解Objective-C?

+1

爲什麼要這麼做?不要試圖打破封裝。實例變量是非常有原因的私有的。它們是實現細節,每次都可以更改。 – 2012-03-22 06:18:07

回答

3

你不知道蘋果做落實navigationController屬性,所以你不能只是假設有一個_navigationController伊娃漂浮在UIViewController類的地方。案例:一個屬性可以聲明爲@dynamic,在這種情況下,實現可以完全是任何東西。

有沒有辦法在伊娃只是通過查看屬性本身支持的屬性猜測。

+1

感謝您提醒我關於* @ dynamic *屬性。 – EmptyStack 2012-03-22 06:34:17

2

你無法猜出伊娃的名字。更重要的是,你不應該試圖訪問超類中聲明的ivars。第三,我們不能保證navigationController屬性完全由伊娃支持,它可以由自定義獲取器來支持,以計算其價值。

+0

好點,它可以是一個自定義的getter。 – louielouie 2012-03-22 06:29:32

+0

確實不錯。 – EmptyStack 2012-03-22 06:37:25

2

我們沒有源的UIKit,所以我們不能說什麼明確的伊娃被調用。

但是,蘋果公約似乎是_ivar。

看起來蘋果已經使用@private來聲明_navigationController(或任何可能被調用的)作爲私人ivar,這意味着ivar只能被該類的實例訪問而不能被子類訪問。

此外 - 該屬性被聲明爲只讀,所以你甚至不能嘗試寫入它,這意味着蘋果真的不希望你改變它。

請注意,你有兩個以上的可能性爲伊娃爾名稱。一個財產可以由任何名義的伊娃代表。如果你看看蘋果的文件,他們有一個例子:

@synthesize firstName, lastName, age=yearsOld; 

這指定的名字,姓氏和年齡存取方法應該合成的和財產的年齡由實例變量yearsOld代表。