@property问题

时间:2011-03-06 11:27:18

标签: objective-c

在我的实现中,我有下面的getter和setter。我想使用属性并合成getter和setter但有一些问题。

- (NSString *)title {
return title;
}

- (void)setTitle:(NSString *)value {
if(title != value) {
    [title release];
    title = [value retain];
}
}

如果我要将其转换为属性,我会使用哪些属性?我是否正确思考:

  • readwrite 所以getter和setter都存在
  • 保留,以便增加值字符串的保留值,以便对象不会丢失它。

我对上述情况是否正确?

最后一件事。我有以下方法......

- (void)setReleaseDate:(NSString *)value {
// YYYY-MM-DD HH:MM:SS +HHMM
if([releaseDate description] != value) {
    [releaseDate release];
    releaseDate = [[NSDate alloc] initWithString:value];
}
}

我是否正确地认为我仍然必须包含该方法,因为它包含合成的getter不包含的代码?

感谢。

3 个答案:

答案 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个对象的问题。

否则,你似乎几乎就是它。