我需要在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 :(得分: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等等关键字添加一些语义。)
最好是阅读您可以找到的文档。有许多易于找到的网页,您可以在其中获得更多详细信息。