在我的实现中,我有下面的getter和setter。我想使用属性并合成getter和setter但有一些问题。
- (NSString *)title {
return title;
}
- (void)setTitle:(NSString *)value {
if(title != value) {
[title release];
title = [value retain];
}
}
如果我要将其转换为属性,我会使用哪些属性?我是否正确思考:
我对上述情况是否正确?
最后一件事。我有以下方法......
- (void)setReleaseDate:(NSString *)value {
// YYYY-MM-DD HH:MM:SS +HHMM
if([releaseDate description] != value) {
[releaseDate release];
releaseDate = [[NSDate alloc] initWithString:value];
}
}
我是否正确地认为我仍然必须包含该方法,因为它包含合成的getter不包含的代码?
感谢。
答案 0 :(得分:1)
关于使用readwrite
以及retain
的断言是正确的,因为它会为您发布的内容创建语义上等效的代码。
当您将NSString
转换为NSDate
以存储它时,无法合成已发布的属性设置器,这也避免了NSString
属性的常见问题为此,您最好使用copy
来避免NSMutableString
出现问题。
除此之外,您的代码还可以,但对于字符串比较,您可能希望将简单指针检查!=
替换为isEqualToString
,请参阅Comparing Strings in Cocoa。
答案 1 :(得分:1)
对于title属性,您可以在类接口中声明它,如下所示:
@property (nonatomic, retain) NSString* title;
与以下内容相同:
@property (readwrite, nonatomic) NSString* title;
readwrite 是默认设置。大多数情况下,您需要为您的属性设置setter,所以对于不这样做的时间,您将使用非默认的 readonly 来指定它。
非原子部分基本上意味着访问器将更快,并且通常使用。您可以在此处找到有关此内容的更多信息:What does the property "Nonatomic" mean?。
对于第二个问题,如果您愿意,可以实现自己的访问者。如果你这样做,它会“覆盖”将由Objective-C生成的访问器。请记住,您必须遵守命名约定。因此,在您的示例中,您定义的“setReleaseDate:”方法将用于属性“releaseDate”的setter方法 - 这是完全正确的! :)你遇到的问题是你传递一个* NSString **来设置日期,这意味着这个方法不会覆盖合成属性时使用的默认setter。您必须传递与您设置的值相同的值作为单个参数,因此对于这种情况,您必须传递* NSDate **。
如果您提供自己的访问器实现,它还必须确保它执行接口中声明的操作。我认为你的 releaseDate 属性应该被声明为retain。
答案 2 :(得分:0)
对copy
属性使用NSString
语义是常见的,但并不总是必需的,以避免在您背后更改NSMutableString
个对象的问题。
否则,你似乎几乎就是它。