Простой вопрос об освобождении выделенной памяти - PullRequest
2 голосов
/ 01 августа 2010

в нескольких примерах кода можно найти это

static NSNumberFormatter *numberFormatter = nil;
if (numberFormatter == nil) {
    numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [numberFormatter setMaximumFractionDigits:6];
}

Разве этот код не вызывает утечки памяти?Или есть какая-то встроенная магия, которая освобождает выделенную память?

С уважением

Ответы [ 5 ]

4 голосов
/ 01 августа 2010

Мне кажется, что этот фрагмент кода откуда-то реализует «шаблон синглтона» или что-то очень похожее на него. Поскольку переменная static, ее значение запоминается между вызовами функций. Это означает, что он выделяется только один раз за время существования приложения.

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

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

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

2 голосов
/ 01 августа 2010

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

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

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

0 голосов
/ 01 августа 2010

Когда вы делаете «alloc», как это:

numberFormatter = [[NSNumberFormatter alloc] init];

, вы должны «отпустить» объект, иначе он будет вытекать:

[numberFormatter release];
0 голосов
/ 01 августа 2010

Этот пример будет подтекающим. У вас есть счет отсчета один здесь ...

numberFormatter = [[NSNumberFormatter alloc] init];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...