2013-12-18 55 views
0

下面是一個代碼示例,它引起了一些痛苦,並想知道是否有人可以提供幫助。我想在構造函數中設置類的'版本'屬性,因爲它使用了很多處理(所以不想在每次另一個類獲得屬性時重新計算它)。命名返回屬性值的私有方法

如果我正確地命名該方法(未暴露給其他類),我將其稱爲- (NSString *)version而不是getVersion。然而,那麼它將成爲這個班的吸氣者。

所以我的問題是,下面的代碼包含一個錯誤地使用術語'get'作爲前綴的方法,但如果我刪除get,那麼突然內部方法變成公共getter,我不想要它是。

有誰知道避免這種情況的最佳做法?

#pragma mark Constructor 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here 
     self.version = [self getVersion]; 
    }  
    return self; 
} 

#pragma mark General 

- (NSString *)getVersion 
{ 
    // some computation to work out version 
} 
+0

'[self computedVersion]'? –

+0

'版本'是一個公共屬性? – nhgrif

+0

我認爲如果你調用'permformSelector:@selector(getVersion)'方法將會被調用...... – Francesco

回答

3
- (NSString *)version { 
    @synchronized(self) { 
     if (_version == nil) { 
      // some computation to work out version 
      _version = //result of computation 
     } 
    } 
    return _version; 
} 

第一次調用[self version](在init),retVersionnil,以進行計算。每一次之後,它都是非零且是靜態的,所以你只需返回第一次計算的結果。

如果需要,您可以從其他方法(此getter外部)更改_version

+1

PS:你也可以使用內部屬性變量_version而不是依靠單獨的靜態變量。 – Kalyan02

+0

@Kalyan是的,謝謝 – nhgrif

+0

你也可以使用'dispatch_once'代碼... – Francesco

1

您可以以僅執行一次計算的方式覆蓋默認getter。 這樣你不需要在構造函數中進行賦值。

- (NSString *)version 
{ 
    // check if internal variable has data, if not, do your thing 
    if (!_version) { 
     // perform your intensive version fetching operation 
     // and assign it to the internal variable of the property _version 
     _version = [self versionImplementation]; 
    } 
    // now just return it 
    return _version; 
} 

內部變量是制定者也有幫助,例如在驗證數據

- (void)setVersion:(NSString *)newVersion 
{ 
    if(newVersion > kSomeConstant) 
    { 
     _version = newVersion; 
    } 
} 

當屬性合成,_version會自動創建,所以你可以確信它的存在。您還可以通過明確合成內部變量名稱來自定義內部變量名稱

@synthesize version = _myCustomVersionVariable; 
+0

使用下劃線作爲前綴而不是後援名稱的後綴。除了其他事項之外,不遵守約定會破壞KVC的兼容性。 – jlehr

+0

@jlehr它違背了約定,但是它是一個定製的例子 – Kalyan02

+0

那麼爲什麼要提供一個違反蘋果公司針對ivars的命名慣例的例子,這可能會導致問題?另外,你的setter方法是錯誤的 - 它應該是'setVersion:',而不是'version:'。請更新您的答案。 – jlehr