为什么subdataWithRange会导致任何NSThread中的内存泄漏?

时间:2018-09-17 21:54:40

标签: objective-c automatic-ref-counting

对此我感到困惑。我以为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];
    }
}

1 个答案:

答案 0 :(得分:2)

所有NSThreads以这种方式泄漏。 NSThreads没有自己的自动释放池。在除主线程之外的任何线程上执行时,必须始终要做的第一件事是创建一个自动释放池。当然,最好不要一开始就使用NSThread。这就是为什么有GCD的原因。