1
我在.h文件的屬性和.m文件合成的,我知道我可以通過釋放:ObjC:我可以使用property = nil而不是self.property = nil來釋放它嗎?
self.property = nil;
,但我可以用:
property = nil;
呢?
謝謝!
我在.h文件的屬性和.m文件合成的,我知道我可以通過釋放:ObjC:我可以使用property = nil而不是self.property = nil來釋放它嗎?
self.property = nil;
,但我可以用:
property = nil;
呢?
謝謝!
號這是因爲使用的是retain
選項生成的@synthesized
方法(或strong
,如果你使用ARC)實際上是這個樣子:
- (void)setValue:(NSString *)newValue {
[value autorelease];
value = [newValue retain];
}
因此,當你做self.property = nil
,舊的價值將被自動釋放,並且nil
將被保留,反正什麼也不做。
當你只是做iVar = nil
,你永遠不會釋放對象變量先前包含,所以你泄漏。
當然,如果你使用ARC(自動引用計數),你不必擔心任何這些。編譯器會爲你完成這項工作。在這種情況下,iVar = nil
的效果與self.iVar = nil
的效果完全相同,但有些人可能會認爲它不太清晰。
只有當你不使用ARC時,這纔是真實的。如果使用ARC,即使未調用setter方法(假設屬性/ ivar的所有權限定符爲「強」),對象也會被釋放。儘管如此,國際海事組織,最好明確地調用setter。 –
@Andrew這是一個很好的觀點,但由於您不必擔心ARC中的保留/發佈,我認爲他在本例中使用了手動引用計數。不過,我想我可以編輯它,但爲了安全起見。 –
將伊娃設置爲零而不使用屬性訪問器工作,但是否定了具有屬性的關鍵點。如果您正在使用訪問器,並且稍後決定在更改屬性值時需要發生某些事情,則只需將代碼添加到訪問器方法即可。如果您不使用訪問器並想要這樣做,那麼您必須搜索您直接觸摸伊娃的每個地方。 – rickster