NSMutableArray как @property с readonly - PullRequest
4 голосов
/ 21 марта 2009

Предположим, у меня есть что-то вроде этого:

@property (readonly) NSMutableArray *someArray;

Могу ли я изменить [obj someArray], даже если для @property установлено только чтение?

Ответы [ 2 ]

10 голосов
/ 21 марта 2009

Да, вы можете изменить его содержимое. Только чтение относится только к самому указателю - таким образом, это , а не , как в C ++ const.

В сущности, сказать «только для чтения» означает «не переводить a.someArray = foo в [a setSomeArray:foo]». То есть сеттер не создан.

(Конечно, если вы хотите предотвратить изменение, вы просто используете вместо него NSArray.)

3 голосов
/ 21 марта 2009

Содержимое 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];
}

Обратите внимание, что вызывающая сторона все еще сможет изменять состояние объектов в массиве. Если вы хотите предотвратить , что , вам нужно сделать их неизменными при вставке или выполнить depp-копию массива в методе доступа readOnlyArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...