Назначение и сохранение NSString - PullRequest
1 голос
/ 09 августа 2010

Просто простой вопрос по NSStrings, у меня есть фрагмент кода, который присваивает значение строке, в зависимости от того, что найдено, ему либо присваивается значение substringToIndex, либо константа string @ "0.00", можно ли используйте

// Save if value found, otherwise set to 0.00
if (parsedCharacters == nil || [parsedCharacters isEqualToString:@""])
        self.currentDiscountedPrice = @"0.00";
else
{
  // Truncate extra digits from string to 2 decimal places (find full stop, save 2 places after it)
  NSRange fullStopRange = [parsedCharacters rangeOfString:@"."];
  self.currentDiscountedPrice = [parsedCharacters substringToIndex:(fullStopRange.location + 3)];
}

для присвоения, поскольку оно освободит старое значение и сохранит новое значение?

Нет способа узнать, была ли var присвоена константная строка или возвращенное значение substringToIndex на предыдущей итерации, но мне сказали, что вызов retain & release для константных строк безвреден, это правда?

1 Ответ

1 голос
/ 09 августа 2010

NSString не является особенным;все объекты Какао следуют правилам управления памятью Какао .Пока у вас тоже все будет хорошо.

Мне сказали, что вызывать сохранение и освобождение константных строк безопасно, это правда?

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

… стоит ли явно явно освобождать старое значение и сохранять значение substringToIndex или можно просто использовать self.currentDiscountedPrice = для обоих назначений?

Вы должны использовать свойство везде, но в init методах и dealloc.Это единственные методы, которые должны явно отправлять retain и release сообщения объекту в переменной экземпляра.

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

Передача объекта константной строки в свойство не представляет опасностисеттер.Он сохранит или скопирует объект как обычно.

В этой заметке, когда значение свойства является объектом класса с изменяемым вариантом (поскольку NSString имеет NSMutableString), вы должны объявить свойство как копирующее его значение.(@property(copy) или @property(nonatomic, copy)), чтобы вы не брали в совместное владение чужой изменчивый объект.Если они видоизменяют объект, это может вызвать у вас проблемы, особенно если вы сохранили объект в коллекции хэширования (такой как ключ словаря), а не в переменной экземпляра.

...