对此我感到困惑。我以为ARC可以在这里处理内存。在此if语句之后,永远不会使用subData。
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];
}
}
答案 0 :(得分:2)
所有NSThreads以这种方式泄漏。 NSThreads没有自己的自动释放池。在除主线程之外的任何线程上执行时,必须始终要做的第一件事是创建一个自动释放池。当然,最好不要一开始就使用NSThread。这就是为什么有GCD的原因。