NSString свойство копировать или только для чтения? - PullRequest
6 голосов
/ 03 ноября 2011

Я вижу много дискуссий о том, что я должен использовать copy для свойства NSString, потому что это не позволит другим изменить его за моей спиной.Но тогда почему бы нам просто не установить для него свойство readonly ?

Обновление

Спасибо за ответ на мой вопрос.Но дело в том, что для свойства NSString вы всегда не хотите, чтобы другие модифицировали его, верно?Вы можете изменить это самостоятельно, но определенно не другие.Я предполагаю, что большую часть времени NSString получает свое начальное значение (либо вами, либо другими), после этого только вы будете изменять его.Тогда почему бы просто не использовать свойство readonly

На самом деле я использую копирование большую часть времени.Но потом я понимаю, что большую часть времени я использую только эти сеттеры в своем методе init.Поэтому я думаю, что для этих случаев я должен использовать readonly, а не copy.

Итак, позвольте мне задать вопрос следующим образом: если вы используете эти сеттеры только для своих строк NSS в вашем методе init, то вы должны использовать вместо этого readonly.Это разумный вывод?

Ответы [ 2 ]

12 голосов
/ 03 ноября 2011

если вы используете эти сеттеры только для ваших строк NSS в вашем методе init, то вам следует использовать только для чтения.Это разумный вывод?

Поскольку вы не должны использовать средства доступа в частично построенных состояниях (init / dealloc), то вы должны объявить его как copy и readonly, тогдавыполнить копию в инициализаторе:

- (id)initWithName:(NSString *)inName
{
  self = [super init];
  if (0 != self) {
    name = [inName copy];
  }
  return self;
}

Более подробно, copy и readonly являются семантически различными понятиями.

  • Вы используете copy, потому чтоВы заинтересованы в стоимости в большинстве случаев.Это также гарантия и оптимизация для использования неизменяемых строк.

  • Вы используете readonly, чтобы запретить клиентам изменять / настраивать ваши данные.

Вместе они обеспечивают хорошую степень безопасности, но в одиночку:

  • copy по-прежнему позволяет клиентам устанавливать значение в любой точке выполнения программы через установщик.

  • readonly не означает copy, и оставшееся имущество может быть изменено за вашей спиной;подумайте, что происходит, когда вам передают изменяемый вариант, и клиент изменяет его после вызова установщика.

Самый безопасный способ - использовать copy и readonly.

  • очевидно, вы будете использовать readwrite, когда вам нужно будет предоставить сеттер своим клиентам, и вы поддерживаете это изменение.

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

6 голосов
/ 03 ноября 2011

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

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