Это хороший способ освободить память? - PullRequest
9 голосов
/ 30 июня 2011

Я довольно давно программирую на iPhone и плохо управляю памятью.Мне было интересно, если следующий способ является хорошим способом освободить память.

int count = [someObject retainCount];

for (int i = 0; i < count; i ++) 
{
[someObject release];
}

Этот метод был актом отчаяния в нескольких ситуациях (особенно UIWebViews), с которыми я столкнулся.Переменная retainCount уменьшается до нуля, что освобождает используемую ею память.Метод немного грязный, но есть ли какие-нибудь узкие места, связанные с ним?

Ответы [ 6 ]

28 голосов
/ 30 июня 2011

Вы не должны полагаться на retainCount, потому что существует возможность удержания объекта iOS фреймворками,

Читайте ниже, что Apple говорит о retainCount.

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

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

14 голосов
/ 30 июня 2011

Этот код является абсолютным не ходите .Он просто скрывает ваши ошибки в программировании - и делает это очень плохо.

Пожалуйста, изучите правильное управление памятью.Замены нет.

Вот руководство по управлению памятью .Стоит прочитать не раз.

7 голосов
/ 30 июня 2011

Как уже упоминали другие, -retainCount практически бесполезен.Когда вы новичок в управлении памятью / подсчете ссылок в Objective-C, иногда может возникнуть соблазн попытаться использовать - retainCount, чтобы помочь понять, как работает подсчет ссылок, но в действительности это может (на первый взгляд) сбить с толкуbest.

Код, который вы разместили, сам по себе потенциально опасен, в зависимости от окружающего контекста использования someObject.Это также может быть опасно применительно к другим ситуациям, которых вы не ожидали.Возьмем константу NSString s, созданную с использованием директивы компилятора @"a string": эти строки созданы и не предназначены для выпускаПоэтому применение вашего кода, как в следующем примере, приведет к бесконечному циклу:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *string = @"theString";

    NSLog(@"retainCount == %lu", (unsigned long)[string retainCount]);

    for (NSUInteger i = 0; i < [string retainCount]; i++) {
        [string release];
    }

    [pool drain];
    return 0;
}

Это напечатает:

2011-06-30 08:40:16.287 retainCount[35505:a0f] retainCount == 1152921504606846975

, а затем перейдет в бесконечный цикл.

6 голосов
/ 30 июня 2011

Я не могу сказать категорически НЕТ!

Возьмите этот пример вашего кода в действии:

// Create an autoreleased object
MyObject *myObject = [[[MyObject alloc] init] autorelease];

// Run your code to make it dealloc itself
int count = [myObject retainCount];
for (int i = 0; i < count; i ++)
    [myObject release];

Ваш код заставит myObject быть освобожденным.

Тем не менее, myObject также был добавлен в пул автоматического выпуска - как только пул начал выпускать свои объекты, ваше приложение зависало, потому что myObject больше не существует!

Правило простое: каждый раз, когда вы используете init, new или copy, вызывайте релиз. В противном случае это не ваша проблема.

3 голосов
/ 30 июня 2011

Следует обращаться к примечаниям по управлению памятью:

(1) http://mobileorchard.com/iphone-memory-management/

(2) http://memo.tv/memory_management_with_objective_c_cocoa_iphone

(3) http://akosma.com/2009/01/28/10-iphone-memory-management-tips/

3 голосов
/ 30 июня 2011

Вы не должны полагаться на значение retainCount. Вы должны выпускать так часто, как вы звонили alloc и copy.

Редактировать: и new и retain.

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