Вернуть объект как только для чтения - PullRequest
3 голосов
/ 07 декабря 2011

Как бы вы вернули объект из метода, чтобы он был только для чтения для вызывающего? Обратите внимание, что это не свойство, которое можно просто установить только для чтения, когда объявлен его метод получения

т.е. @property(nonatomic,retain,readonly) NSDate* pub_date;

Например:

-(SomeClass*)getObject
{
  SomeClass* object = [[SomeClass alloc] init];
  //Don't allow writing to 'object'
  return object;
}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Краткий ответ: простого способа сделать это не существует.

Более длинный ответ: платформа Apple определяет своего рода стандарт для своих классов коллекций, где неизменяемая коллекция - это базовый класс, а изменяемая коллекция - наследующий класс.,Так, например, NSMutableArray наследуется от NSArray.Вы можете следовать этому стандарту и иметь методы, которые возвращают MyClass клиентам, используя MyMutableClass внутри них.Технически, конечно, клиент все еще может отправлять мутирующие сообщения, но IMHO, что это не большой риск (в конце концов, клиент не знает деталей вашей реализации).

Есть и другие, более сложные варианты - выможет использовать перестановку указателя, или создать подкласс и переопределить все изменяющие методы, или просто скопировать изменяемый класс в неизменный аналог (это не сложно, но может привести к снижению производительности).Но для достижения наилучших результатов вы, вероятно, должны следовать примеру Apple.

1 голос
/ 07 декабря 2011

Это зависит от объекта.Если у него есть изменяемая / неизменяемая пара (например, NSString / NSMutableString), тогда ваш метод получения может вернуть неизменяемую версию.

В противном случае вы не можете управлять поведением других объектов - после того, как вы вернули объект, вы не сможете управлять им со стороны объекта, который его первоначально предоставил.

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

Пример:

ОбъектA имеет свойство изменяемой строки, объект B запрашивает эту изменяемую строку, получатель напрямую возвращает переменную экземпляра, поддерживающую свойство.

Объект B затем изменяет строку - свойство объекта A также было изменено, поскольку оба объекта имеют указатель на одну и ту же изменяемую строку.

В этом случае вы бы вернули копию объекта, а не сам объект.Если ваш объект является пользовательским, вы должны реализовать протокол NSCopying, чтобы разрешить это.

Еще одно замечание - объявление свойства как доступного только для чтения означает, что не будет создан метод доступа к установщику, т. Е. objectA.property = newValue; приведет к ошибке компилятора.

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