2010-02-26 71 views
2
self.flipsidenavigationbar=aNavigationBar; 

爲什麼這裏需要自我? (否則它崩潰)Dot Syntax Issue

[flipsidenavigationbar pushnavigationietm........]; 

爲什麼這裏不需要自己?

請注意,flipsidenavigationbar是一個iVar聲明爲屬性和綜合。

謝謝

亞歷

+1

btw通常在obj-c對象名稱中使用CamelCase。 'flipsideNavigationBar' – kubi 2010-02-26 14:12:04

回答

2

被宣佈爲 「保留」 屬性類型flipsidenavigationbar?我對這是怎麼回事的猜測。

爲你寫它的點語法方法等同於

[self setFlipsidenavigationbar:aNavigationBar]; 

,並調用此方法是可能保留aNavigationBar對象,當你設置它。當你調用

flipsidenavigationbar = aNavigationBar; 

保留它,它有可能被你希望它是,造成你崩潰前發佈。

您可以在Obj-C中閱讀更多關於dot syntax的信息,它可能會幫助您解決將來出現的類似問題。


另外兩張海報說好,但要記住,這兩條線是非常重要的:

self.myViewA = myViewB; 
myViewA = myViewB; 

必須是完全無關的潛力。點語法只是方法調用的簡寫,您可以使該方法調用做任何你想做的事情。就像你在您的評論

我明白,當一個人需要 設置/初始化你需要 放在那裏的「自我」的屬性提這一點很重要的是,而不是用於處理性能的規則。但是,當你'告訴' 它做某事(在這種情況下,推動 )你不需要自我。

你應該明白到底發生了什麼,所以你知道你的點語法使用的效果是什麼。我知道,這很讓人困惑,但這並不難,每個人都很快就會收拾起來。祝你好運!

+0

aNavigationBar在我將它放入setFlipSideNavigationBar後發佈; setFlip ...是一個保留屬性。在所有的答案後,我明白,當需要設置/初始化一個屬性時,你需要放置'自我'。但是,當你「告訴」它做某件事(在這種情況下推動),你不需要自我。 – 2010-02-28 14:27:16

+0

我編輯了我的答案作爲對此評論的回覆。 – kubi 2010-03-01 12:58:10

2

由於瘋狂是點符號。我實際上建議新的ObjC開發人員完全避免它,因爲上述混淆。

flipsidenavigationbar是一個指針。它的只是的指針。如果你說flipsidenavigationbar = aNavigationBar,你用另一個指針替換一個指針。如果您保留了以前的指針,則不會釋放它。你不會開始保留aNavigationBar。這是C.這裏沒有魔法。

self.flipsidenavigationbar不是一個簡單的指針(儘管看起來像一個結構)。這是一個方法調用。作爲一個右值,它是[self flipsidenavigationbar]。作爲一個左值,它是[self setFlipsidenavigationbar:]。這些調用代碼。在大多數情況下,setFlipsidenavigationbar:方法包括釋放舊值並保留新值。

有幾件事情你應該做的,以避免混淆:

  • 總是,總是使用訪問器來訪問你的高德。切勿直接訪問它們。
  • 爲了達到這個目的,請不要將您的ivars定義爲與您的訪問者具有完全相同的名稱。所以你會有一個名爲_flipSideNavigationBar的伊娃,它映射到flipSideNavigationBar。這個語法是@synthesize foo = _foo
  • 只要您願意,可以避免使用點符號。我們之前在ObjC編程的時候很少遇到麻煩,因爲我們直觀地知道它在做什麼,而且鍵入起來更容易一些。但是這對新開發者來說是非常混亂的,我通常建議避免它。學會說[self foo][self setFoo:]。代碼會更有意義。
+0

「永遠不要將你的ivars定義爲與你的訪問者具有完全相同的名字」 這是很好的建議,它絕對應該在任何新的可可書籍的第一章。 – kubi 2010-02-26 14:45:10

5

您需要記住的是,點不僅僅是訪問iVar的語法,而是調用設置(或獲取)ivar的方法的簡寫。

這意味着self.foo與foo不一樣(假設foo是作爲屬性聲明的伊娃)。 self.foo =值;相當於[self setFoo:value];或value = self.foo相當於value = [self foo];當你只寫foo時,你直接訪問foo而不用任何方法調用。

該區別很重要,因爲setter和getter方法通常不只是分配或獲取值,而是保留該值。

所以,你的情況,當你寫:

self.flipsidenavigationbar=aNavigationBar; 

你實際上是在調用此伊娃setter方法使這條線就相當於:

[self setFlipSideNavigationBar:aNavigationBar]; 

假設屬性定義爲複製或保留,然後調用setter將保留導航欄。另一方面,如果你寫:

self.flipsidenavigationbar = aNavigationBar;

然後你只是設置self.flipsidenavigationbar直接aNavigationBar沒有保留的價值,可導致應用程序在訪問aNavigationBar後

至於其他問題崩潰:

[flipsidenavigationbar foo]; 

只是一個方法調用,你不必使用點(儘管你可能有時需要),因爲你可以直接在實例方法中引用ivars。

(順便說一句:爲什麼不使用駱駝案件?這真的很傷眼睛)