2012-03-06 67 views
3

在其中一個Standford IOS tutorials中,教師使用延遲實例化來創建計算器引擎類的實例。如何在目標c中做懶惰的實例化?

他使用在my former question露出的第二語法:

@synthesize myTextField = _myTextField; 

在此語法,吸氣myTextField具有_myTextField不同的名稱,以便它可以測試

if (_myTextField != nil) { ... } 

如何做到這一點與經典的第一種語法,因爲getter和實例變量的名稱是相同的(myTextField)?

回答

4

如果使用@sythensize variableName = _variableName;則實例變量將被調用_variableName,這是你需要使用直接訪問它的內容。 variableName是用來生成setter和getters的名字,所以如果你使用@synthesize variableName;那麼這個實例變量將與合成的setter和getter具有相同的名字。您仍然可以訪問實例變量與variableName = ...但其更容易弄混,你應該使用

所以2個懶加載implemetations

@synthesize varName = _varName 

- (id)varName 
{ 
    if (!_varName) 
     _varName = [[NSObject alloc] init]; 

    return _varName; 
} 

@synthesize varName; 

- (id)varName 
{ 
    if (!varName) 
     varName = [[NSObject alloc] init]; 

    return varName; 
} 

就個人而言,我去哪個對於@synthesize varName = _varName它更容易閱讀和更難以混淆,當你訪問變量時,當你意味着二傳手,反之亦然

+0

或者只是我們e ARC並忘記您正在設置哪個:) – 2012-03-06 17:16:30

+0

即使使用ARC,也不希望繞過訪問者無意中。這打破了KVO以及可能存在於存取器中的任何其他副作用。如果你使用'varName'而不是'self.varName',你會悄悄錯過這樣的懶惰實例化的副作用。 – 2012-03-06 17:20:52

+0

@ RichardJ.RossIII是使用弧消除了很多內存頭痛,但我一般堅持約定,所以你知道你正在訪問。同樣使用ARC不會改變延遲加載實現,上面的代碼適用於ARC和內存管理的應用程序(假設varName被保留) – wattson12 2012-03-06 17:21:07