[英]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的訪問更安全(KVC)。 也許這可以在你必須使用每一個時總結。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.