これを行う方法はいくつかありますが、合理的な方法の 1 つは、非公開の変更可能な配列を維持し、パブリックに読み取り専用のアクセサーを提供することです。次に、パブリック アクセサーが内部配列の不変のコピーを返すようにします。それは次のようになります。
.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
実行時例外がスローされたのではなく、スローされた結果に対してミューテーション メソッドを呼び出そうとするコードについて警告するコンパイラを信頼できる場合は、コピーなしで実行できます。もう 1 つの注意点は、コピーがないと、プライベート配列への変更は、不変と思われる配列への以前に取得された参照であっても「見られる」ことです。