有幾個方法可以做到這一點,但一個合理的辦法是維持一個私人的,可變數組,然後爲公衆提供只讀訪問。然後你只需要公共訪問器返回一個內部數組的不可變副本。這將是這個樣子:
在.h文件:
@interface MyClass : NSObject
@property (readonly) NSArray *publicArray;
@end
在.m文件:
@interface MyClass()
@property NSMutableArray *privateArray;
@end
@implementation MyClass
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"publicArray"]) {
keyPaths = [keyPaths setByAddingObject:@"privateArray"];
}
return keyPaths;
}
@synthesize privateArray = _privateArray;
- (NSArray *)publicArray { return [self.privateArray copy]; }
@end
,如果你感到舒適的票你可以沒有副本編譯器警告有關嘗試對-publicArray
的結果調用突變方法的代碼,而不是拋出運行時異常。另一個需要注意的是,如果沒有副本,即使在先前獲得的對所謂的不可變陣列的引用中,私有數組的任何更改都將被「看到」。
其他類仍然能夠修改,即使它的只讀屬性的可變數組。唯一隻讀的是指針本身。數組內的對象可以從外部自由修改。 – 2012-07-11 18:14:00
我希望能夠修改數組中的項目,正是我想避免是其他類如果暴露陣列作爲可變的(只被讀取,即使)從這個數組 – aryaxt 2012-07-11 18:14:55
添加和刪除對象的其他類_will be_能夠添加或刪除數組中的項目 – 2012-07-11 18:21:33