2

对于从不实际存储您传递给它的对象的设置器,最合适的关键字是什么?(复制、保留或转让)

具体来说,下面的 endDate 设置器从不存储传递的日期,在内部它只是更新 numberOfNights NSUInteger。

相应的 getter 重新组合 startDate 和 numberOfNights 以返回一个新的 endDate 对象。

@property (nonatomic, readonly) NSDate *startDate;
@property (nonatomic) NSUInteger numberOfNights; //modifiable.
@property (nonatomic, copy) NSDate *endDate; //internally stored as an unsigned integer, number of nights.

我觉得复制属性最有意义。(你传递给 -setEndDate: 的指针永远不会被 -endDate 返回)

有什么想法吗?

4

4 回答 4

1

我相信,如果您自己实现 getter/setter,那么您无需担心保留与分配。这些关键字仅影响自动 getter/setter 的工作方式。您也可以在此处安全地使用 copy 或完全省略。(我在这篇文章中写着“我相信……”,因为我感觉有点生疏,并试图回到 Xcode。今年随着 ARC 越来越受欢迎,事情发生了巨大变化。)

于 2012-09-26T23:04:57.867 回答
1

你为什么要定义一个property你从未真正设置或得到的?如果您要定义method类似的内容,您不会使您的代码更清晰,更易于他人理解:

-(void)setEndDate:(NSDate *)endDate;

然后,您实现这个method,为 numberOfNights 分配一个新值。

于 2012-09-26T23:05:29.823 回答
0

属性的主要好处是能够为私有 ivar 支持的 getter 和 setter 自动创建繁琐的样板代码。在您的情况下,该属性不受 ivar 支持,听起来您无论如何都在编写手动 getter 和 setter。鉴于此,我想说@property语法只是令人困惑(正如您所发现的那样)。我只想声明 2 个方法,并实现它们以numberOfNights在幕后使用:

- (NSDate *)endDate;
- (void)setEndDate:(NSDate *)date;

否则,您使用的任何限定符(保留、复制、分配)都将被忽略,因为您正在手动实现访问器。

于 2012-09-26T23:07:03.933 回答
0

我想不出拥有只写属性非常有意义的场景。如果该属性的唯一目的是更新其他内容,我将使用具有这样名称的方法,以便您的代码尽可能明确:

- (void)updateNumberOfNightsWithEndDate:(NSDate *)endDate;

如果您不小心,具有副作用的属性访问器可能会导致代码混乱,因此通常我会尽量减少它们的使用。

于 2012-09-27T07:56:56.913 回答