[英]What's the difference between self.propertyName vs. propertyName?
標題說明了一切!
在Objective-C中, self.propertyName
與propertyName
什么區別?
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先前內容的引用
點表示法由編譯器轉換為方法調用。 這意味着在運行時還需要執行額外的工作來執行此方法調用,例如從堆棧存儲器中復制一些內容到堆棧存儲器中以及執行機器代碼中的跳轉。
實例變量本身更快,因為它實際上只是一個內存地址或標量值(如int)。
當您想要或需要一個額外的層來執行某項操作時,可能會喜歡使用self.something表示法。 就像保留在第一次需要時傳入的對象或延遲實例化對象一樣。
設置屬性的值就是這樣做的-它直接設置屬性的值,而無需通過任何訪問器或綜合訪問器。
通過self
調用訪問者,您就可以訪問訪問者。 對於使用retain
或copy
聲明的屬性,它將retain
或copy
傳入的值。對於非對象屬性,將assign
通常的聲明,這意味着沒有對這些iVar應用內存管理。
您會看到兩種類型的調用-但最好在初始化程序中使用直接方法,在dealloc
方法中使用,因為在這些方法中不建議對self
進行調用。
如果已聲明並綜合了該屬性,則對self
的調用還會為該變量的更改生成KVO通知。 這樣willChangeValueForKey:
編寫willChangeValueForKey:
和didChangeValueForKey:
方法的willChangeValueForKey:
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.