【问题标题】:Does @property copy in combination with readonly make sense?@property copy 与 readonly 结合是否有意义?
【发布时间】:2012-03-12 22:19:10
【问题描述】:

如果我理解正确,copy 会强制 setter 创建传入对象的副本。但是,如果我将它与 readonly 一起使用,则不会有 setter。那么我的假设是否正确,即结合 @property (copy, readonly) 没有任何意义或者我错过了什么?

【问题讨论】:

标签: ios objective-c properties


【解决方案1】:

确实有道理。例如,如果您只想在实现中访问属性的设置器:

@interface MyClass : NSObject
@property (nonatomic, copy, readonly) NSData *data;

- (id)initWithData:(NSData *)data;

@end

.m 文件中的类延续中:

@interface MyClass ()
@property (nonatomic, copy, readwrite) NSData *data;
@end

请注意,在这种情况下,公共标头中的copy, readonly 声明是必需的!

【讨论】:

  • 如果子类想要在自己的实现中将超类中定义的readonly 属性重新声明为readwrite,则需要考虑相同的注意事项。
  • 根据我的经验,这是一个相当罕见的特殊情况,但你是完全正确的(你们俩),在这种非常特殊的情况下,即使是只读属性也需要copy。跨度>
  • 我不确定从什么时候开始,但是在 Xcode 10+ 中,即使您将其重新声明为 readwrite 和 @987654331,您也不需要将 copy 放入 readonly 声明中@ 在扩展或子类中。所以答案应该是“不,这没有意义。”
【解决方案2】:

根据Apple's documentation(我已在此处为您链接):

copy
指定应使用对象的副本进行分配。

先前的值被发送release消息。

通过调用copy 方法制作副本。该属性有效 仅适用于必须实现NSCopying 协议的对象类型。

所以是的,你是对的...readonly 创建了一个 getter 方法,而 copy 将被有效地忽略,因为没有 setter 方法进行赋值。

【讨论】:

  • 这应该是公认的答案...因为它实际上回答这个问题,哈哈。
【解决方案3】:

我认为,如果我看到这样的属性,在读取时,我希望 ivar 收到一个不同的返回对象,除非返回的对象被宣传为不可变。

如果我有

@property (readonly, copy) NSMutableArray* foo;

我这样做:

NSMutableArray* myFoo = [theObject foo];
[myFoo addObject: @"string"];
NSMutableArray* myOtherFoo = [theObject foo];

我希望myOtherFoo 中没有myFoo 所具有的额外字符串。

注意:我还没有验证这一点。

我现在已经检查过了,我的预期是不正确的。我想我会认为这是一个错误。

【讨论】:

  • “copy”注释是指copy-on-set,而不是copy-on-get。
  • @HotLicks 错误,是的,我知道。您没有阅读我答案的最后两行吗?就个人而言,我仍然认为它是一个错误。
  • 为什么您希望修改对象而不使更改可见?对属性“foo”的两次访问都将获取对同一对象的引用。
  • @HotLicks “对象”是什么意思?您是指属性返回的对象还是具有该属性的对象?如果您指的是前者,我希望连续调用为可变对象返回不同的实例(因为属性说 copy)。如果你的意思是后者,用当前语义修改属性返回的对象是非常糟糕的,因为它破坏了封装——你正在改变对象的内部状态而不知道它。
  • 就像我说的,“复制”注释意味着复制时,而不是复制时获取。如果您希望对象不可变,请使其不可变。上述属性特别要求“可变”。
【解决方案4】:

你是对的,两者兼有是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2018-07-21
    • 2020-12-04
    • 2019-06-27
    • 2017-06-25
    相关资源
    最近更新 更多