Выставление свойства как только для чтения - PullRequest
0 голосов
/ 11 декабря 2011

Я пишу фреймворк и хочу предоставить определенное внутреннее свойство только для чтения. Поэтому я добавил свойство readonly в шапку и синтезировать его вручную, как это.

-(NSMutableURLRequest*) readonlyRequest {

    return [self.request copy];
}

Вызывающая сторона получает копию, которая все еще может быть видоизменена, но не влияет на внутреннее свойство. Это правильный способ сделать? Или есть другие лучшие альтернативы?

Код скомпилирован для ARC, поэтому нет автоматического выпуска

Ответы [ 4 ]

3 голосов
/ 11 декабря 2011

Это на самом деле неверно. Звонящий получит NSURLRequest*. Вам нужно использовать -mutableCopy вместо.

- (NSMutableURLRequest *)readonlyRequest {
    return [self.request mutableCopy];
}

В качестве альтернативы вы должны объявить это как просто NSURLRequest * (что, вероятно, лучше, если у вас нет причин полагать, что вызывающему абоненту нужен запрос mutable ).

Редактировать: Удален бит о autorelease, потому что вопрос был обновлен, чтобы указать, что это ARC.

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

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

Вместосвойство, которое я хотел бы сделать, это просто метод доступа, такой как mutableCopyOfMyData, что более понятно, если пользователь намерен изменить результат так, как он хочет.

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

Я не уверен, что концептуально имеет ли смысл иметь mutableCopy в свойстве только для чтения.Может быть, кто-нибудь мог бы привести несколько примеров того, когда это помогает заполнить пробелы в моем мышлении?

  • Я не могу сделать сравнение, не задаваясь вопросом, был ли объект, который у меня был мутирован, с тех пор, как я его получил
  • Если я получаю объект из класса, который я могу изменить, я обычно предполагаю, что изменяю экземпляр в классе, а не копию.Скорее всего, это приведет к тому, что я буду немного царапать голову, пока не посмотрю ближе на заголовочный файл, чтобы увидеть, что происходит - это, конечно, не так актуально в данном случае, как вы включаете readonly в имя @property, что частоне тот случай.
1 голос
/ 11 декабря 2011

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

...