Хобрук: Ваш путь к мастерству в программировании

Утечка памяти с использованием ARC отображается в симуляторе iOS

Каким-то образом я вижу увеличение памяти в моем симуляторе (бегущая гистограмма).

У меня есть объект с именем MyObject, в котором нет ничего, кроме int. В каком-то другом классе (скажем, MyCar в MyCar.h) у меня есть массив MyObject, например. MyObject* junk[8];

и метод возврата конкретного по индексу:

-(MyObject*) getJunk:(int) index{
    if(junk[index] == nil){
        return nil;
    }
    return junk[index];
}

В другом классе под названием DataModel у меня есть MyCar *mycar;

в DataModel я вызываю метод ask

-(void) ask{
    if(mycar == nil){
        return nil;
    }

    for(int i=0;i<8;i++){
        if( [mycar getJunk:i] == nil){
            continue;
        }
    }
}

Я звоню [self ask] каждый раз по 10 000 раз. Я использую ARC, но каждый раз замечаю, что полоса памяти iOS поднимается вверх. Итак, что-то накапливает память; Не знаю что, у меня нет alloc. Да, это происходит, даже если я пишу такой бесполезный код, который ничего не делает с junk[i], возвращаемым в модель данных.

я даже пытался

-(void) ask{
    if(mycar == nil){
        return nil;
    }

    for(int i=0;i<8;i++){
        MyObject* temp_junk = [mycar getJunk:i];
        if( temp_junk == nil){
            continue;
        }
        temp_junk = nil;
    }
}

  • Где вы создаете объекты, которые входят в массив? Вы запускали анализатор над этим кодом или использовали инструменты? Где указана утечка? 17.02.2014
  • Используете ли вы объекты Zombie, включенные в диагностике? Кажется так. 17.02.2014
  • Используя инструмент выделения, вы можете увидеть, какие объекты выделяются и используют память. Это должно дать вам подсказку, где искать. 17.02.2014
  • Возможно, ARC автоматически освобождает возвращаемое значение от getJunk; это может привести к использованию дополнительной памяти в пуле автоосвобождения до тех пор, пока он не будет очищен, что обычно происходит в конце события. Но в этом случае большая часть памяти в конечном итоге должна быть восстановлена. Что произойдет, если вы поместите @autoreleasepool { ... } вокруг цикла for? 17.02.2014
  • У вас есть блок авторелиза внутри цикла? 17.02.2014
  • Спасибо всем за ответы. Карл, это сделал авторелиз Hot Licks. Таким образом, похоже, что время сброса непредсказуемо, если вы не используете autorelease. Мой код был очень простым, и я не использовал никаких инструментов. Я абсолютно свеж в лодке, когда дело доходит до Objective C и iOS :-) установки инструментов и того, как их использовать сегодня. 18.02.2014
  • @magellan_tor Любая причина для использования массива C MyObject [], а не NSArray? В простых случаях хранение NSObjects в C-массиве просто работает, в других случаях очень легко изменить требования к управлению/размеру памяти. Не то, чтобы вы это сделали, но это беспокоит, особенно там, где NSArray просто работает. 18.02.2014
  • Память, вероятно, не была самими объектами, если ваш код действительно репрезентативен - он будет автоматически выпускать один и тот же объект снова и снова. Однако пул автоматического освобождения должен увеличиваться, чтобы удерживать каждый автоматически освобождаемый объект до тех пор, пока он не будет сброшен. Таким образом, периодическая очистка означает, что сам пул автоматического выпуска не будет увеличиваться, что, вероятно, было большей вашей проблемой. 18.02.2014

Ответы:


1

Если вы вызываете [self ask] 10000 раз в цикле, например:

for (int = 0; i < 10000; i++)
    [self ask];

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

for (int i = 0 ; i < 10000; i++)
{
    @autoreleasepool
    {
        [self ask];
    }
}

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

17.02.2014
  • Джош, да, это сработало. Как я уже говорил выше, похоже, вы не можете предсказать, когда выйдет ARC. 18.02.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..