2012-04-25 61 views
1

我有一個整數變量,例如,timeSignature,宣佈它在h文件,和合成的雙設置器/吸氣劑的方法:覆蓋setter方法,並獲得「XXX的本地聲明隱藏實例變量」

在.H:

@interface Metronome : NSObject { 
    int timeSignature; 
} 
@property (nonatomic) int timeSignature; 

中的m:

@synthesize timeSignature; 

我希望覆蓋setter方法:當用戶設置一個新的值給它,它別的東西,以及不斷變化的新的價值:

- (void) setTimeSignature:(int)timeSignature { 
    self.timeSignature = timeSignature; //hides instance variable warning at this line 
    [self doesSomethingElse]; 
} 

繼承人問題,局部變量和實例變量具有相同的名稱。

我該如何避免這種情況?

回答

5

名稱的伊娃_timeSignature,使@synthesize timeSignature = _timeSignature;

+0

這可能是最好的解決方案,謝謝! – 2012-04-25 07:30:05

1

只需重命名方法參數即可解決問題。此外,您的代碼產生無限遞歸,你居然再次撥打您的setter方法 - 你需要刪除屬性調用以及:

- (void) setTimeSignature:(int)timeSignature_ { 
    timeSignature = timeSignature_; //hides instance variable warning at this line 
    [self doesSomethingElse]; 
} 
6

重命名參數變量名:

- (void) setTimeSignature:(int)newTimeSignature { 
    timeSignature = newTimeSignature; //hides instance variable warning at this line 
    [self doesSomethingElse]; 
} 

此外,不使用從設置器內的屬性,這將創建一個無限循環! self.timeSignature =將調用setTimeSignature!

這是人們使用下劃線名稱(_timeSignature)作爲屬性支持ivar的原因之一。

1

重命名參數。我使用aTimeSignaturenewTimeSignature

而且,這是一個更大的問題:

self.timeSignature = someVar; 

[self setTimeSignature: somevar]; 

點符號誤導你以爲的屬性是從模子不同的只是語法糖。這是不正確的,物業設置和getter。你真正擁有的是:

- (void) setTimeSignature:(int)timeSignature { 
    [self setTimeSignature: timeSignature]; //hides instance variable warning at this line 
    [self doesSomethingElse]; 
} 

一旦你改變記號,你應該能夠看到明顯的困難。

如果你是Objective-C的新手,你應該真的避免點符號,直到你完全確信你完全理解它的作用(這是Big Nerd Ranch iOS編程指南的建議)。

+2

這個例子是一個調用'setTimeSignature'的無限循環。 – 2014-06-03 14:15:14