2011-06-18 44 views
0

標題說明了一切!self.propertyName與propertyName有什麼區別?

在Objective-C中,self.propertyNamepropertyName有什麼區別?

+2

搜索功能是否被破壞?這已經被問及已經回答了幾十次了。看看這裏的相關帖子-------> – Roger

+0

@roger,試着在提問問題頁面粘貼相同的標題和問題,你會發現自己。 :) – necixy

+2

..好吧,它看起來並不破碎;-) – Roger

回答

2

self.propertyName如果指定了propertyName在財產申報保留

propertyName的,不會增加保留計數的可能會導致應用程序崩潰的一個適當增加保留計數。

e。 G。 ,

@property (nonatomic,retain) NSString* propertyName; 

可以說你有nameProperty的NSString對象。 下面增加保留計數1,你可以使用self.propertyName並調用release

self.propertyName = nameProperty; 
[nameProperty release]; 

下面一點兒也不增加保留計數,所以如果你在你的應用程序中使用propertyName的它會導致應用程序崩潰的。

propertyName = nameProperty; 
[nameProperty release]; 

propertyName的進一步使用將導致崩潰。

+0

它不爲非對象類型,如'BOOL'或'NSInteger'或'CGFloat'等做任何內存管理。 – Abizern

+0

@ Abizern:爲什麼downvote?不是一個有效的理由,仔細閱讀答案我給了NSObject的例子與財產中的保留,它也被接受:(只要問自己的重要性,保留'基本類型... – Jhaliya

+0

因爲你已經回答了一個特定的案例,而不是全部的情況,不僅僅是保留一個對象,還有更多的不同 - 對retainCount的引用是誤導性的,不要想到對象的保留計數,只是擔心釋放你擁有的對象。如果你傳入的對象是一個靜態字符串呢?它的'retainCount'沒有增加,但是它已被保留。 – Abizern

4

self.propertyName是發送對象的消息,要求它爲propertyName值,這意味着它可能會經歷一個getter/setter方法等propertyName直接訪問伊娃,繞過任何getter/setter。 Here's an article進入它更詳細。

2

自我。通過你的可能合成訪問方法運行,如果您使用性能

即self.propertyName =了newName是一樣的[自setPropertyName方法:了newName]

這將成爲存儲管理的重要的參數propertyName =了newName會導致你鬆散引用propertyName的前一個內容

1

點符號轉換爲編譯器調用的方法。這意味着在運行時會有額外的工作來執行此方法調用,例如從堆棧內存中複製某些內容並執行機器代碼跳轉。

實例變量本身更快,因爲它本質上只是一個內存地址或標量值(如int)。

當你想要或需要一個額外的圖層去做某件事時,你會更喜歡self.something符號。就像保留傳入的對象或者第一次懶惰地實例化對象。

0

設置屬性的值就是這樣 - 它直接設置屬性的值,而不通過任何訪問器或合成訪問器。

通過調用訪問器通過self您正在訪問訪問器。對於已使用retaincopy聲明的屬性,將傳入的值爲retaincopy。對於非客觀性屬性,通常聲明爲assign,這意味着沒有應用於這些iVar的內存管理。

您可以看到兩種類型的呼叫 - 但在初始化程序和dealloc方法中優先使用直接方法,因爲在這些方法中不鼓勵對self的呼叫。

如果您聲明併合成了該屬性,則對self的調用還會爲該變量中的更改生成KVO通知。這節省了您不得不編寫willChangeValueForKey:didChangeValueForKey:方法。

+0

總結所有上面給出的答案... – Jhaliya

+0

爲什麼downvote這個? Upvoting補償。 – Altealice

+0

不要冒犯,請不要在這裏使用**報復這樣的詞。沒有任何個人來自我的身邊,不知道你在結束,Plz不會誤導這裏的人,我們在這裏支持社區開發者,給他們一個更好的答案,而不是一個回答的總結, – Jhaliya