假设我有这样的事情:
@property (readonly) NSMutableArray *someArray;
即使@property设置为只读,我可以修改[obj someArray]吗?
答案 0 :(得分:10)
是的,您可以修改其内容。 readonly仅适用于指针本身 - 这样,它就像 一样,不像C ++的const
。
基本上,说“只读”只意味着“不要将a.someArray = foo
翻译成[a setSomeArray:foo]
”。也就是说,没有创建setter。
(当然,如果你想阻止修改,你只需使用NSArray
。)
答案 1 :(得分:3)
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。