Я смущен этим. Я думал, что 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];
}
}