Когда память на самом деле освобождается в Objective-C? - PullRequest
1 голос
/ 28 апреля 2010

Я пытаюсь понять вещи управления памятью в Objective-C. Если я вижу использование памяти в списке Activity Monitor, похоже, что память не освобождается (я имею в виду столбец rsize) Но в «Распределении объектов» все выглядит хорошо. Вот мой простой код:

#import <Foundation/Foundation.h>

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


NSInteger i, k=10000;
while (k>0) {
    NSMutableArray *array = [[NSMutableArray alloc]init];

    for (i=0;i<1000*k; i++) {
        NSString *srtring = [[NSString alloc] initWithString:@"string...."];
        [array addObject:srtring];
        [srtring release];
        srtring = nil;
    }

    [array release];
    array = nil;
    k-=500;

}

[NSThread sleepForTimeInterval:5];
[pool release];

return 0;
}

Что касается сохранения и выпуска, это круто, все сбалансировано. Но rsize уменьшается только после выхода из этой маленькой программы. Можно ли как-то "очистить" память перед выходом?

1 Ответ

2 голосов
/ 28 апреля 2010

Нет смысла пытаться очистить память перед выходом; вы выходите из системы, поэтому все ваши скудные ресурсы возвращаются в систему.

Распространенным заблуждением является то, что free() (основной механизм освобождения) немедленно возвращает память в систему; в большинстве реализаций это не так, а скорее добавляет его во внутренний свободный список; на котором хранится память для использования вашим приложением, но высвобождается в систему по запросу. Во второй раз, когда ваш цикл вращается, ваше приложение повторно использует эту свободную память для выделения, а не для запроса большего из системы, что делает все более плавным для всех.

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