2012-01-16 45 views
1

考慮下面的代碼:覆蓋訪問器getter方法的最簡單方法是什麼?

// MyClass.h 
@interface MyClass 
    @property NSInteger Value; 
@end 

//MyClass.m 
@implementation MyClass 
    @synthesize Value; 
@end 

什麼是我需要做,如果我想重寫Value合成的setter方法最小的代碼修改?

作爲一項後續行動,爲了覆蓋只有合成的getter方法,我必須進行哪些最小修改?

編輯

重載很簡單。 (見下面的答案)在我的情況下,我收到了一個令人討厭的警告,因爲我沒有在屬性定義中包含nonatomic屬性。添加屬性已解決了導致此問題的最初問題。

回答

3

顯然它是不可能重寫一個或另一個原子屬性。您必須將其更改爲具有nonatomic屬性。

@property (nonatomic) NSInteger value; 

我不知道五分鐘之前,它不是任何地方TOCPL據我可以看到指出。

也將名稱更改爲小寫。 ObjC中的公約是針對ivars的較低首字母。

除此之外,只需實現你想要的任何一個,編譯器將完成剩下的工作。您可以有效地覆蓋沒有,一個或兩個。

只是吸氣劑:

@implementation MyClass 

@synthesize value; 

- (NSInteger) value { 
    return value; 
} 

@end 

只需將設定器:

@implementation MyClass 

@synthesize value; 

- (void) setValue: (NSInteger)newValue { 
    value = newValue; 
} 

@end 

對象類型的方法(和覆蓋原子)僅稍微複雜;這裏有幾個關於SO的問題,並且some info in the Apple docs會解釋。

+0

我可以得到一個修改後的樣本。具體來說,我試圖重寫一個setter,我得到一個'可寫的原子屬性'Value'不能在我的代碼中將一個合成的setter/getter與用戶定義的setter/getter'錯誤消息配對。 – RLH 2012-01-16 21:25:05

+0

謝謝。僅供參考,在我的錯誤的情況下,將'(nonatomic)'屬性添加到我的屬性修復了警告。 – RLH 2012-01-16 21:30:02

+0

這很有趣。看起來也許你也必須把它變成「非原子」。我剛學到了一些東西! – 2012-01-16 21:32:40

1

讓一切上面是(不是改變Valuevalue規範等),然後您可以實現一個或兩個:

-(NSInteger)value 
{ 
    return value; 
} 

-(void)setValue:(NSInteger)newValue 
{ 
    value = newValue; 
} 

value作爲一類場自動創建。如果您使用的是保留對象,除非使用ARC,否則您需要手動保留/釋放。

相關問題