2013-11-27 3 views
0

Глядя на профайлер памяти, он показывает увеличение использования памяти, медленное, но устойчивое. Все это в следующих 2-х линиях в NSStreamDelegate:Утечка памяти в iOS с профилировщиком

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 

    case NSStreamEventHasBytesAvailable: 
    { 
     if (theStream == inputStream) { 
      int bytesRead = 0; 
      static uint8_t buffer[1024]; 
      bytesRead = [inputStream read:buffer maxLength:sizeof(buffer)]; -- this line causing the memory to grow 
      //[inBuffer appendBytes:buffer length:bytesRead]; 
      //Do something 
     } 
     break; 
    } 

    } 

Я думаю, что буфер заполняется каждый раз, когда он получает там и покраснел, так как его местные. Так в чем проблема?

+0

Возможно, вам нужно показать больше кода, связанного с утечкой – chancyWu

+0

Я не верю, что проблема лежит в коде, который вы нам поделили. Если вы ищете утечки в профилировщике, он показывает вам, где был выделен просочившийся объект, но он не сможет (не может) показать вам источник утечки. BTW, вы запустили этот код через статический анализатор («Анализировать» в меню «Продукт» Xcode)? – Rob

+0

Нет, я не запускал его через статический анализатор, я попробую. Возможно, что какой-то другой код является проблемой, но вряд ли есть какой-либо код в другом месте, о котором я могу думать, этот тест так же прост, как чтение байтов в буфер, как я показал. Когда я замечаю, что одна строка, память становится устойчивой. – IronMan1980

ответ

0

Код выглядит хорошо.

Если вы ищете резюме распределения, «Общие байты» будут постоянно увеличиваться, так как они также включают временные байты (которые являются временными). Убедитесь, что вы наблюдаете «Live Bytes»/«# Living». Кроме того, код выглядит настолько эффективным, что он не выделяет собственную память для каждого цикла. «Статическая» переменная - это просто копирование содержимого на уже выделенном пространстве. Таким образом, даже если отображается некоторое выделение, это может быть связано с методом чтения.

PS: вы также можете проверить, действительно ли объект NSStream имеет собственный производный тип и имеет ли он пользовательскую реализацию метода чтения.

0

Странно, я пробовал все инструменты профайлера, это не помогало, и память все еще становилась все более устойчивой, я разделил ее на очень простой код, показанный выше, и память все еще возрастала. Из разочарования я закончил копирование своего кода в новый пустой проект, запустил его, и память выглядела устойчивой. Я не знаю, в чем причина этого странного поведения. Обратите внимание, что это приложение обрабатывает данные IP/TCP на высоких скоростях.

Смежные вопросы