2012-09-13 47 views
0

當MyClass的字符串值被改變時,我需要添加一些代碼。 所以我試圖重寫MyClass的字符串屬性方法。 但我不知道..所以我喜歡跟隨。 這是正確的嗎?是否有可能重寫屬性的方法?

如何覆蓋屬性的方法?

@interface MyClass{ 
    NSString *string; 
} 

@property(retain, nonatomic) NSString *string; 
@end 


@implementation MyClass 

- (void)setString:(NSString*)newString{ 
    // want to add some codes. 

    [self setString:newString]; <= Is this correct? 
} 

@end 

回答

0
- (void)setString:(NSString*)newString{ 
    // want to add some codes. 

    string = newString; //This is the setter method! 
    // You will need to consider memory management etc. 
} 

你是什麼可能更達是這樣的:

- (void)setString:(NSString*)newString{ 
    // want to add some codes. 

    [super setString:newString]; 
} 

[self setString:newString]在這個地方將是一個無限遞歸循環。 [super setString:newString]應該打電話給superlass'setter。但是,我從來沒有這樣做過。

+0

我認爲上面的代碼不考慮財產的論點。例如)保留,複製,非原子等。 –

+0

是的,你是對的。我會修補答案。我想我現在明白你的意思了。 –

0

你要做的是不要重寫(子類不涉及你的代碼片段)。

您代碼中的內容僅爲聲明@interface和定義@implementation。它與C中的聲明/定義具有相同的含義和效用,您可以在.h文件中聲明聲明,並在.c文件中定義聲明。

假設你正在談論如何綜合,你的代碼幾乎是正確的。你只是錯過了吸氣劑- (NSString *) string;或者你只讀了。

至於如何做正確的分配應該使用=

- (void)setString:(NSString*)newString{ 
    // want to add some codes. 

    string = newString; // Correct way of doing it 
} 

還有就是合成propertie 2的方式,無論是通過使用語法糖@synthesize定義用手或任何setter和getter 。

爲了更好地理解,認爲@property@synthesize都是句法糖。 (只有@property正在增加一些語義與保留,強等關鍵字)。

更好的是閱讀您可以找到的文檔。有很多容易找到的網頁,你可以有更多的細節。

相關問題