使用readonly将NSMutableArray作为@property

时间:2009-03-21 00:01:46

标签: objective-c

假设我有这样的事情:

@property (readonly) NSMutableArray *someArray;

即使@property设置为只读,我可以修改[obj someArray]吗?

2 个答案:

答案 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。

相关问题