self.flipsidenavigationbar=aNavigationBar;
爲什麼這裏需要自我? (否則它崩潰)Dot Syntax Issue
[flipsidenavigationbar pushnavigationietm........];
爲什麼這裏不需要自己?
請注意,flipsidenavigationbar是一個iVar聲明爲屬性和綜合。
謝謝
亞歷
self.flipsidenavigationbar=aNavigationBar;
爲什麼這裏需要自我? (否則它崩潰)Dot Syntax Issue
[flipsidenavigationbar pushnavigationietm........];
爲什麼這裏不需要自己?
請注意,flipsidenavigationbar是一個iVar聲明爲屬性和綜合。
謝謝
亞歷
被宣佈爲 「保留」 屬性類型flipsidenavigationbar
?我對這是怎麼回事的猜測。
爲你寫它的點語法方法等同於
[self setFlipsidenavigationbar:aNavigationBar];
,並調用此方法是可能保留aNavigationBar
對象,當你設置它。當你調用
flipsidenavigationbar = aNavigationBar;
你不保留它,它有可能被你希望它是,造成你崩潰前發佈。
您可以在Obj-C中閱讀更多關於dot syntax的信息,它可能會幫助您解決將來出現的類似問題。
另外兩張海報說好,但要記住,這兩條線是非常重要的:
self.myViewA = myViewB;
myViewA = myViewB;
必須是完全無關的潛力。點語法只是方法調用的簡寫,您可以使該方法調用做任何你想做的事情。就像你在您的評論
我明白,當一個人需要 設置/初始化你需要 放在那裏的「自我」的屬性提這一點很重要的是,而不是用於處理性能的規則。但是,當你'告訴' 它做某事(在這種情況下,推動 )你不需要自我。
你應該明白到底發生了什麼,所以你知道你的點語法使用的效果是什麼。我知道,這很讓人困惑,但這並不難,每個人都很快就會收拾起來。祝你好運!
aNavigationBar在我將它放入setFlipSideNavigationBar後發佈; setFlip ...是一個保留屬性。在所有的答案後,我明白,當需要設置/初始化一個屬性時,你需要放置'自我'。但是,當你「告訴」它做某件事(在這種情況下推動),你不需要自我。 – 2010-02-28 14:27:16
我編輯了我的答案作爲對此評論的回覆。 – kubi 2010-03-01 12:58:10
由於瘋狂是點符號。我實際上建議新的ObjC開發人員完全避免它,因爲上述混淆。
flipsidenavigationbar
是一個指針。它的只是的指針。如果你說flipsidenavigationbar = aNavigationBar
,你用另一個指針替換一個指針。如果您保留了以前的指針,則不會釋放它。你不會開始保留aNavigationBar
。這是C.這裏沒有魔法。
self.flipsidenavigationbar
是不是一個簡單的指針(儘管看起來像一個結構)。這是一個方法調用。作爲一個右值,它是[self flipsidenavigationbar]
。作爲一個左值,它是[self setFlipsidenavigationbar:]
。這些調用代碼。在大多數情況下,setFlipsidenavigationbar:
方法包括釋放舊值並保留新值。
有幾件事情你應該做的,以避免混淆:
_flipSideNavigationBar
的伊娃,它映射到flipSideNavigationBar
。這個語法是@synthesize foo = _foo
。[self foo]
和[self setFoo:]
。代碼會更有意義。「永遠不要將你的ivars定義爲與你的訪問者具有完全相同的名字」 這是很好的建議,它絕對應該在任何新的可可書籍的第一章。 – kubi 2010-02-26 14:45:10
您需要記住的是,點不僅僅是訪問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。
(順便說一句:爲什麼不使用駱駝案件?這真的很傷眼睛)
btw通常在obj-c對象名稱中使用CamelCase。 'flipsideNavigationBar' – kubi 2010-02-26 14:12:04