Objective c 对于其setter方法不存储传递的对象的Obj-C属性,适当的关键字是什么?

Objective c 对于其setter方法不存储传递的对象的Obj-C属性,适当的关键字是什么?,objective-c,Objective C,对于从不实际存储传递给它的对象的setter,最合适的关键字是什么?(复制、保留或转让) 具体来说,下面的endDate setter从不存储传递的日期,它只在内部更新NumberOfInteger 相应的getter重新组合startDate和numberOfNights以返回一个新的endDate对象 @property (nonatomic, readonly) NSDate *startDate; @property (nonatomic) NSUInteger numberOfNigh

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

具体来说,下面的endDate setter从不存储传递的日期,它只在内部更新NumberOfInteger

相应的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.
我觉得copy属性最有意义。 (传递给-setEndDate:的指针将永远不会在-endDate之前返回)


有什么想法吗?

我相信,如果您自己实现getter/setter,那么您就不必担心retain和assign。这些关键字只影响自动getter/setter的工作方式。您也可以在这里安全地使用copy,也可以完全忽略它。(我在这篇文章中写了“我相信…”,因为我觉得有点生疏,正试图回到Xcode。随着ARC越来越受欢迎,今年情况发生了巨大变化。)

为什么你要定义一个你从未真正设置或获取的
属性?如果您定义一个
方法
,比如:

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

然后实现这个
方法
,为numberOfNights指定一个新值。

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

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

否则,您使用的任何限定符(retain、copy、assign)都将被忽略,因为您正在手动实现访问器。

我想不出哪种情况下,拥有一个只写属性有什么意义。如果该属性的唯一目的是更新其他内容,我将使用一个名称如下的方法,以便您的代码尽可能明确:

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

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

如果我要求
yourObject.endDate
,我会得到一个自动删除的NSDate实例,它是根据
numberOfNights
属性计算出来的?这只是头,当然.m本身实现了setter和getter方法。最重要的是,这是一个人为的例子,为了被问到的问题。好吧,那么请忘记我的答案,但也许其他人会从中得到帮助。我支持你@Richard,我认为这个案件不应该是一个申报财产。似乎任何存储属性都不正确。