Потенциальная утечка памяти - PullRequest
0 голосов
/ 30 июля 2011

Я работаю над проектом на iPhone iOS с Xcode 4.

С Xcode> Продукт> Анализ я получаю 35 проблем, все этого типа:

 myTextField.text = [[NSString alloc] initWithFormat:@"0.2f", abc];

, и проблема заключается в«Потенциальная утечка объекта, выделенного в ...»

Что такое объект-нарушитель и как я могу его освободить?

Спасибо

Ответы [ 3 ]

5 голосов
/ 30 июля 2011

Вы пропускаете строку, которую назначаете myTextField.text. Когда это назначение происходит, создается копия (см. Определение свойства в документации ). В большинстве случаев, когда значения являются неизменяемыми, как в случае с NSStrings, копия даст вам экземпляр, который указывает на то же местоположение, что и копируемый объект, с счетом сохранения, увеличенным на 1.

В случае вашего кода:

myTextField.text = [[NSString alloc] initWithFormat:@"0.2f", abc];

Число сохраненных выделенных вами строк равно 2.

Вам необходимо (1) освободить (или автоматически выпустить) строку или (2) использовать один из удобных методов NSString, например, stringWithFormat: создать строку. Это даст вам автоматически выпущенную строку, поэтому вам не придется беспокоиться о ее явном освобождении.

(1)

NSString *str = [[NSString alloc] initWithFormat:@"0.2f", abc];
myTextField.text = str;
[str release]

или

myTextField.text = [[[NSString alloc] initWithFormat:@"0.2f", abc] autorelease];

(2)

myTextField.text = [NSString stringWithFormat:@"0.2f", abc]; // autoreleased
4 голосов
/ 30 июля 2011

Вы несете ответственность за освобождение созданного здесь строкового объекта - поскольку вы используете для этого alloc / init.

Наиболее удобный способ установки строки - использовать метод класса +stringWithFormat, который возвращает автоматически освобожденную строку, поэтому система выпустит этот строковый объект для вас позже:

myTextField.text = [NSString stringWithFormat:@"0.2f", abc];

Или выВы можете написать авто-релиз явно, если хотите:

myTextField.text = [[[NSString alloc] initWithFormat:@"0.2f", abc] autorelease];

Если вы не хотите использовать авто-релиз, вы можете использовать временную переменную, чтобы создать новую строку и освободить ее после того, как она была задана для текстового поля:

NSString *tempString = [[NSString alloc] initWithFormat:@"0.2f", abc];
myTextField.text = tempString;
[tempString release];
2 голосов
/ 30 июля 2011

Дело в том, что текстовое свойство UiTextFields объявлено как:

@property(nonatomic, copy) NSString *text

Поэтому в этой строке:

 myTextField.text = [[NSString alloc] initWithFormat:@"0.2f", abc];

Создается новый NSString с счетом сохранения 1, а затем myTextField.text копирует этот объект и увеличивает его счет хранения на 1 или делает ??, давайте посмотрим, что происходит:

  1. A NSString объект, созданный с помощью alloc initWithFormat с счетом сохранения 1
  2. A NSString объект с является копией предыдущей строки, но поскольку NStrings являются неизменяемыми в этом случае, копия возвращает тот же объект! , поэтому NSString на самом деле имеет счет удержания 2.
...