Объявляя свойство annotations
NSArray
, код, который обращается к массиву через это свойство , не может безопасно изменить его и должен рассматривать его как неизменяемый NSArray
.Однако это не означает, что сам массив является неизменным.
Вот пример того, как что-то подобное может работать:
@interface MyObject
{
// instance variables
NSMutableArray* internalArrayRepresentation;
}
// properties
@property (nonatomic, readonly) NSArray* immutableAccessor;
// methods
-(void)addItem:(NSObject*)object;
@end
@implementation MyObject
@synthesize immutableAccessor=internalArrayRepresentation;
-(id)init
{
if ((self = [super init]))
{
// create the mutable array
internalArrayRepresentation = [[NSMutableArray alloc] init]
}
}
-(void)addItem:(NSObject*)object
{
[internalArrayRepresentation addObject:object];
}
...
@end
В этом примере вы можете видеть, что internalArrayRepresentation
является изменяемым массивом и доступен вне MyObject как immutableAccessor
.Но поскольку в определении свойства сказано, что immutableAccessor
является NSArray
, вызывающие абоненты должны обращаться с ним таким образом и не могут манипулировать им.
Существуют и другие реализации, которые также могут выполнить это.
Типичная причина для использования такого шаблона заключается в том, что вы хотите, чтобы MyObject
сохранял контроль над содержимым массива: возможно, могут быть добавлены только определенные объекты, возможно, объекты должны быть изменены или клонированы по пути,может быть что-нибудь может быть добавлено, но ничего не может быть удалено и т. д.