是否可以覆盖属性的方法?

时间:2012-09-13 10:51:52

标签: objective-c

我需要在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

2 个答案:

答案 0 :(得分: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]应该调用超类'setter。但是,我自己从未这样做过。

答案 1 :(得分: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正在使用retain,strong等等关键字添加一些语义。)

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