簡體   English   中英

_和自我之間的區別。在Objective-C中

[英]Difference between _ and self. in Objective-C

在調用@property時,使用下划線和在Objective-C中使用self關鍵字有區別嗎?

財產申報:

@property (weak, nonatomic) NSString *myString;

在酒店打電話給@synthesize

@synthesize myString = _myString;

如果我想在我的代碼中使用它,是否有區別? 什么時候? 在getter / setter中?

self.myString = @"test";
_myString = @"test";

self.myString = @"test"; 完全等同於寫[self setMyString:@"test"]; 這兩個都在調用方法。

您可以自己編寫該方法。 它可能看起來像這樣:

- (void)setMyString:(NSString*)newString
{
    _myString = newString;
}

因為您使用了@synthesize ,所以您不必實際編寫該方法,您只需允許編譯器為您編寫它。

因此,通過查看該方法,看起來調用它將完成與為實例變量賦值完全相同的事情,對吧? 嗯,這不是那么簡單。

首先,您可以編寫自己的setter方法。 如果這樣做,您的方法將被調用,它可以執行各種其他操作以及設置變量。 在這種情況下,使用self.myString =將調用您的方法,但不會執行_myString = ,因此將使用不同的功能。

其次,如果您使用Key Value Observing,編譯器會做一些非常聰明的技巧。 在幕后,它會對你的類進行子類化,並覆蓋你的setter方法(無論是你自己編寫的還是通過合成生成的方法),以便調用willChangeValueForKey: Key Value Observing所需的工作。 你不需要知道它是如何工作的(雖然如果你想睡前閱讀它會很有趣!),但是你需要知道如果你想要Key Value Observing自動工作,你必須使用setter方法。

第三,即使你依靠合成寫一個方法,調用setter方法也可以為將來提供靈活性。 您可能希望在更改值時執行額外操作,並且在您發現要執行此操作時,您可以手動編寫setter方法 - 如果您習慣於始終使用self.myString = ,那么您不需要更改代碼的其余部分來開始調用新方法!

第四,這同樣適用於子類。 如果其他人要對您的代碼進行子類化,那么如果您使用setter,那么他們可以覆蓋它們來調整功能。

無論何時直接訪問實例變量,您都明確沒有提供在此時掛鈎額外功能的方法。 由於您或其他人可能希望在將來使用此類功能,因此除非有充分的理由不這樣做,否則始終使用設置者是值得的。

你是對的 - 第一個版本( self.myString )調用合成的getter / setter,第二個版本直接訪問私有成員變量。

看起來你正在使用ARC,所以在這種情況下它並沒有那么大的差別。 但是,如果您不使用ARC,則可能會有所不同,因為直接分配給私有成員不會觸發使用synthesize為您生成的自動保留/釋放或復制/釋放邏輯。

_ (下划線)只是一個約定,如本問題所述

如果您沒有使用self.為屬性訪問添加前綴self. ,您正在直接訪問底層變量,如在ac struct 通常,您應該只在init方法和自定義屬性訪問器中執行此操作。 這允許計算屬性和KVC之類的東西按預期工作。

有一個提示沒有提及,使用下划線的訪問速度更快,使用self的訪問更安全(KVC)。 也許這可以在你必須使用每一個時總結。

暫無
暫無

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

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