Почему subdataWithRange приводит к утечке памяти в любом NSThread? - PullRequest
0 голосов
/ 18 сентября 2018

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

    if ([_buffer length] >= _bufferSize) {
        NSRange range = NSMakeRange(0, _bufferSize);
        NSData *subData = [_buffer subdataWithRange:range];
        // Call the delegate method to deal with the new data
        [_delegate inputQueue:self inputData:subData numberOfPackets:inNumberPacketDescriptions];
        // Remove the transmitted data
        [_buffer replaceBytesInRange:range withBytes:NULL length:0];
    }

Но вызов subdataWithRange приводит к утечке памяти. subData никогда не выпускается. Я обнаружил, что кто-то сказал, что subdataWithRange определенно приведет к утечке памяти под NSThread. Но почему?

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

При добавлении автозапуска утечка устранена. Но почему ...

if ([_buffer length] >= _bufferSize) {
    @autoreleasepool {
        NSRange range = NSMakeRange(0, _bufferSize);
        NSData *subData = [_buffer subdataWithRange:range];
        // Call the delegate method to deal with the new data
        [_delegate inputQueue:self inputData:subData numberOfPackets:inNumberPacketDescriptions];
        // Remove the transmitted data
        [_buffer replaceBytesInRange:range withBytes:NULL length:0];
    }
}

1 Ответ

0 голосов
/ 18 сентября 2018

Все утечки NSThreads таким образом.NSThreads не имеют своего собственного пула автоматического выпуска.Первое, что вы должны всегда делать при выполнении в любом потоке, кроме основного, - это создание пула автоматического выпуска.Конечно, лучше никогда не использовать NSThread.Вот почему есть GCD.

...