2017-01-24 27 views
0

我知道這個問題已經被問過,但可能不在同一個上下文中。我的問題是,我有一個singleton類,在應用程序的生命週期中只有dipatched_once。在這個類中,我有一些方法正在訪問實例變量,並在實例上設置它們時採取行動。這是例子,我如何試圖訪問他們的:Objective C _underscore vs self.variable

// .m文件:

接口:

@property (nonatomic, assign, readwrite) BOOL userLoggedIn; 

實現: //方法:

-(void)someMethod{ 
    if(!_userLoggedIn){ 
    } 
    else { 
    } 
} 

我知道我也可以使用self來評估這樣的值:

-(void)someMethod{ 
    if(self.userLoggedIn){ 
    } 
    else { 
    } 
} 

想知道哪個是訪問該值的正確方法?我沒有綜合這些屬性,因爲它們都只在.m文件的界面中聲明。謝謝您的幫助!

+0

這取決於,但是如果你有' - (BOOL)userLoggedIn {}'實現,那可能會改變行爲。 – Larme

+0

[iOS:自變量和下劃線(\ _)與變量的用法](http://stackoverflow.com/questions/12175229/ios-usage-of-self-and-underscore-with-variable) – holex

+0

If 'userLoggedIn'只是爲了在實現中使用而定義的,並且您正在使用對變量的直接訪問,是否有理由聲明屬性?爲什麼不只是使用一個實例變量(如'@implementation {BOOL userLoggedIn;} ...' – CRD

回答

5

這取決於。

你想調用存取器嗎? _variable是直接訪問。 self.variable調用-variable,由編譯器自動合成。

當值發生變化時,前者不會觸發KVO。後者的確如此。這可能是一個功能或反功能。

但是,無論你選擇什麼,特別是寫作操作,請保持一致,否則你將在未來追蹤錯誤。


的一般規則:

  • 訪問直接在-init/-dealloc

  • 可以使用setter /吸氣劑(點語法)其他任何地方訪問


請注意,直接ccess不尊重atomic

+0

非常感謝! – randomorb2110

+0

你是指被調用或未被調用的變量是什麼意思 – randomorb2110

+1

@ randomorb2110'_variable = 10;'直接設置實例變量'self.variable = 10;'轉換爲'[self setVariable:10];'。一個是直接寫入,一個是調用setter方法。 – bbum