2012-09-19 66 views
0

我創建了一個setter模塊,當任何內容被存儲到_textColor變量中時它將被調用,但它不工作,如果我刪除新的setter模塊並讓合成器創建默認的模塊,默認的將起作用。這個問題是,當我有一個名爲'fillColor'的變量時,我最終得到了一個名爲setFillColor的不同模塊:Setter方法不被調用

我省略了大部分無關代碼 在我的頭文件中,以下:

@interface ICADrawingObject : NSObject <NSCoding> { 
@private 
    NSColor     *_textColor; 
} 
@property (nonatomic, retain, readwrite, setter=setObjectTextColor:) NSColor* textColor; 

在實現我:

@synthesize textColor = _textColor; 

-(void)setObjectTextColor:(NSColor *)textColor{ 
    NSLog(@"Text Old Color: %@",self.textColor); 
    NSLog(@"Text New Color: %@",textColor); 

    _textColor = textColor; 
} 
+0

只是好奇,你爲什麼改變二傳手的名字?這是非常罕見的,可能會破壞部分KVC(我還沒有測試過,因爲這是一件不尋常的事情)。有時候我們改變getter的名字(專爲布爾值),但幾乎不會是setter的名字。 –

+0

還請注意,如果您直接訪問ivars,則無法獲取要運行的方法。所以當你說「什麼時候存儲到'_textColor'變量的時候,」這是不可能的。你應該到處使用訪問器(除了init和dealloc)。如果純粹是爲了調試,您可以使用LLDB「觀察點」來觀察內存何時發生變化。但是,如果在沒有訪問者的情況下更改ivar,則不會導致代碼運行。 –

+0

Tbh,我想嘗試讓setter工作,部分是爲了節省我的工作,同時也是由於我的同事在整個代碼中使用變量名會導致很多問題。仔細查看代碼,我發現由於綁定了xib文件中的變量而出現了很多問題,我認爲最好的做法是重命名變量並保持一切安全 –

回答

0

這將是這樣的:

-(void)setTextColor:(NSColor *)textColor{ 
    if (_textColor != textColor) { 
    [_textColor release]; 
    _textColor = [textColor retain]; 

} 
+0

這使用默認方法,我需要讓它使用setObjectTextColor:方法 –

0

如何:

@interface ICADrawingObject : NSObject { 
    NSColor *_textColor; 
} 
@property (nonatomic, retain, setter=setObjectTextColor:) NSColor *textColor; 
@end 

@implementation ICADrawingObject 
@synthesize textColor = _textColor; 

-(void)setObjectTextColor:(NSColor *)aColor{ 
    NSLog(@"Text Old Color: %@",_textColor); 
    NSLog(@"Text New Color: %@",aColor); 
    if(_textColor != aColor) { 
     [_textColor release]; 
     _textColor = [aColor retain]; 
    } 
    _textColor = aColor; 
} 

@end 

之後,如果我們這樣做:

ICADrawingObject *obj = [ICADrawingObject new]; 
obj.textColor = [NSColor blackColor]; 

那麼這應該打印到控制檯,作爲證據,證明了定製的setter被稱爲:

2012-09-19 08:37:43.605 test323[67540:303] Text Old Color: (null) 
2012-09-19 08:37:43.606 test323[67540:303] Text New Color: NSCalibratedWhiteColorSpace 0 1 

順便說一下,在ivars上不需要@private這個名稱。您可以通過在實現中聲明ivars來控制可見性。