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
4

2 回答 2

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 的二传手。但是,我自己从来没有这样做过。

于 2012-09-13T10:55:41.007 回答
0

您要做的不是覆盖(您的代码片段中不涉及任何子类)。

您的代码中的内容只是声明@interface和定义@implementation。它与 C 中的声明/定义具有相同的含义和实用性,您将声明放在.h文件中,将定义放在.c文件中。

假设您在谈论如何合成,那么您的代码几乎是正确的。你只是错过了 getter- (NSString *) string;或者你是只读的。

至于如何正确完成作业,您应该使用=

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

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

有两种合成属性的方法,一种是手动定义 setter 和 getter,另一种是使用语法糖@synthesize

为了更好地理解,请考虑@property@synthesize都是语法糖。(只是@property用保留、强等关键字添加了一些语义)。

更好的是阅读您可以找到的文档。有许多易于找到的网页,您可以在其中了解更多详细信息。

于 2012-09-13T12:44:39.883 回答