Отладка памяти iPhone - PullRequest
       10

Отладка памяти iPhone

1 голос
/ 09 января 2009

Я использую инструменты, чтобы попытаться определить, есть ли в моем приложении места, где я мог бы быть более эффективным с использованием памяти. Я потратил время, чтобы немного ознакомиться с инструментами, но я, как правило, новичок в поиске проблем управления памятью, происходящих из Java-опыта. Кажется, я использую около 1,82 МБ при вызовах этого метода:

+ (NSString *)stringFromDateWithFormat:(NSDate *)date withFormat:(NSString *)format
{
    NSDateFormatter *dateFormatter;
    NSString *result;

    if (nil == date || nil == format)
        return nil;

    result = nil;
    if (nil != (dateFormatter = [[NSDateFormatter allocWithZone:[self zone]] init])) {
        [dateFormatter setDateFormat:format];   

        if (nil != (result = [dateFormatter stringFromDate:date])) {
            [dateFormatter release];
            return result;
        } 

        [dateFormatter release]; 
    } 
    return nil;
}

Когда я выпускаю средство форматирования даты, мне интересно, является ли моя проблема результатом NSString . Мне кажется, что вызов библиотеки stringFromDate вернул бы автоматически выпущенный объект, поэтому я ничего не могу сделать, чтобы «вручную» управлять им. Немного неуверен в том, как оптимизировать этот метод.

Ответы [ 3 ]

4 голосов
/ 09 января 2009

Этот метод вызывается много раз в цикле? Автоматически освобожденные объекты освобождаются только тогда, когда освобождается NSAutoreleasePool, в котором они находятся. Насколько я понимаю, пул автоматического выпуска по умолчанию создается и освобождает каждый цикл событий. Возможно, вы создаете слишком много автоматически выпущенных объектов в течение одного цикла событий. Решение состоит в том, чтобы создать свой собственный NSAutoreleasePool в соответствующем месте и освободить его для очистки автоматически выпущенных объектов. Крайний пример, который иллюстрирует точку:

int i;
NSAutoreasePool* pool = nil;
for (i = 0; i < 1000000; ++i) {
    /* Create a new pool every 10000 iterations */
    if ((i % 10000) == 0) {
        if (pool) [pool release];
        pool = [[NSAutoreleasePool alloc] init];
    }
    [someObj someMethodThatCreatesAutoreleasedObjects];
}
[pool release];

В этом примере текущий пул освобождается каждые 10 000 итераций, и создается новый. Подробнее об управлении памятью вы можете прочитать в Руководстве по программированию управления памятью в пуле автоматического освобождения.

0 голосов
/ 09 января 2009

Я не на 100% с этим. Я также только учусь разработке Mac / Iphone. Но вы можете использовать пул автоматических выпусков, чтобы помочь с управлением памятью. Он используется для решения проблем с выпуском.

Вот статья с лотами на управление памятью . Проверьте левостороннее меню.

0 голосов
/ 09 января 2009

В любом случае вам нужно возвращать автоматически освобожденный объект, так что вы ничего не должны делать с строкой результата. Я не вижу ошибок, связанных с памятью, но ваш код определенно более многословен, чем нужно. Помните, что в Objective-C, если вы вызываете метод для nil, вы возвращаете nil (или 0 для целого числа, но не для значений с плавающей запятой). Вы можете удалить все эти операторы if и два возвращаемых пути, и ваш код все равно будет работать так же. Кроме того, я бы просто использовал alloc вместо allocWithZone.

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