簡體   English   中英

self.propertyName與propertyName之間有什么區別?

[英]What's the difference between self.propertyName vs. propertyName?

標題說明了一切!

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

self.propertyName在發送對象的消息,要求它為的值propertyName ,這意味着它可以經歷的getter / setter等propertyName直接訪問的ivar,繞過任何的getter / setter。 這是一篇詳細介紹它的文章

self.propertyName如果指定了一個可適當增加保留計數propertyName作為財產申報保留

propertyName不會增加保留計數,否則可能導致應用程序崩潰。

例如

@property (nonatomic,retain) NSString* propertyName;

假設您有nameProperty NSString對象。 在下面,將保留計數增加1,您可以使用self.propertyName並調用release

self.propertyName = nameProperty;
[nameProperty release];

下面不會增加保留計數,因此,如果在應用程序中使用propertyName,將導致應用程序崩潰。

propertyName = nameProperty;
[nameProperty release]; 

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

自。 如果使用屬性,則通過可能的綜合訪問器方法運行

即self.propertyName = newName與[self setPropertyName:newName]相同

這對於內存管理非常重要,因為propertyName = newName將導致您失去對propertyName先前內容的引用

如果調用self,則可以確定正在調用擁有該屬性的類/對象。

您可能會發現這也很有用:

在Objective-C中分配給自己

點表示法由編譯器轉換為方法調用。 這意味着在運行時還需要執行額外的工作來執行此方法調用,例如從堆棧存儲器中復制一些內容到堆棧存儲器中以及執行機器代碼中的跳轉。

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

當您想要或需要一個額外的層來執行某項操作時,可能會喜歡使用self.something表示法。 就像保留在第一次需要時傳入的對象或延遲實例化對象一樣。

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

通過self調用訪問者,您就可以訪問訪問者。 對於使用retaincopy聲明的屬性,它將retaincopy傳入的值。對於非對象屬性,將assign通常的聲明,這意味着沒有對這些iVar應用內存管理。

您會看到兩種類型的調用-但最好在初始化程序中使用直接方法,在dealloc方法中使用,因為在這些方法中不建議對self進行調用。

如果已聲明並綜合了該屬性,則對self的調用還會為該變量的更改生成KVO通知。 這樣willChangeValueForKey:編寫willChangeValueForKey:didChangeValueForKey:方法的willChangeValueForKey:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM