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

Я использую инструменты, чтобы определить, есть ли в моем приложении места, где можно было бы более эффективно использовать память. Я нашел время, чтобы немного познакомиться с инструментами, но я обычно новичок в поиске проблем с управлением памятью, возникших из-за фона 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 вернет автоматически выпущенный объект, поэтому я ничего не могу сделать, чтобы «вручную» управлять им. Немного не знаю, как оптимизировать этот метод.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 996
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Можете ли вы сказать, почему бы вам не использовать allocWithZone?

Rob 09.01.2009 23:11

Для нормального использования это не требуется, потому что ваши объекты всегда будут размещаться в одной и той же зоне по умолчанию. См. Эту статью: developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/MemoryMgm‌ t /…

Marc Charbonneau 09.01.2009 23:22

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

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

Ответ принят как подходящий

Вызывается ли этот метод много раз в цикле? Автоматически выпущенные объекты освобождаются только тогда, когда освобождается 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 итераций и создается новый. Вы можете узнать больше об управлении памятью в разделе Руководство по программированию управления памятью о пулах с автоматическим выпуском.

Другие вопросы по теме