【发布时间】:2009-03-21 00:01:45
【问题描述】:
假设我有这样的事情:
@property (readonly) NSMutableArray *someArray;
即使@property 设置为只读,我可以修改 [obj someArray] 吗?
【问题讨论】:
标签: objective-c
假设我有这样的事情:
@property (readonly) NSMutableArray *someArray;
即使@property 设置为只读,我可以修改 [obj someArray] 吗?
【问题讨论】:
标签: objective-c
是的,您可以修改其内容。 readonly 仅适用于指针本身 - 这样,它 不 像 C++ 的 const。
基本上,说“只读”只是意味着“不要将a.someArray = foo 翻译成[a setSomeArray:foo]”。也就是说,不会创建任何 setter。
(当然,如果您想防止修改,您只需使用NSArray。)
【讨论】:
someArray 的内容是可修改的,尽管属性不是(即调用不能通过分配给属性来更改 someArray 实例变量的值)。请注意,这与 C++ 的 const 的语义不同。如果您希望数组实际上是只读的(即读者无法修改),则需要使用自定义访问器包装它。在@interface 中(假设您的someArray 属性)
@property (readonly) NSArray *readOnlyArray;
在@implementation
@dynamic readOnlyArray;
+ (NSSet*)keyPathsForValuesAffectingReadOnlyArray {
return [NSSet setWithObject:@"someArray"];
}
- (NSArray*)readOnlyArray {
return [[[self someArray] copy] autorelease];
}
请注意,调用者仍然能够改变数组中对象的状态。如果你想防止那个,你需要让它们在插入时不可变,或者在readOnlyArray访问器中执行数组的depp-copy。
【讨论】:
@dynamic 不是必需的,但可以很好地提醒未来的读者,您打算提供实现而不是综合它。