假设我有这样的东西:
@property (readonly) NSMutableArray *someArray;即使@属性设置为readonly,我也可以修改obj someArray吗?
发布于 2009-03-21 00:06:39
可以,您可以修改其内容。readonly只适用于指针本身--在这种情况下,它不像C++的const。
基本上,说“只读”只是意味着“不要把a.someArray = foo翻译成[a setSomeArray:foo]”。也就是说,不创建setter。
(当然,如果您想防止修改,只需使用NSArray即可。)
发布于 2009-03-21 00:14:39
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访问器中执行数组的深度复制。
https://stackoverflow.com/questions/668418
复制相似问题