基础是我有一个自定义的NSURLProtocol
. 在startLoading
中,[self client]
属于:
<_NSCFURLProtocolBridge> {NSURLProtocol, CFURLProtocol}
问题是在垃圾收集环境中运行它。因为我正在编写一个屏幕保护程序,所以我被迫将其作为垃圾收集器。但是,_NSCFURLProtocolBridge 协议似乎总是抛出:
malloc: reference count underflow for (memory_id_here), break on auto_refcount_underflow_error to debug
调试控制台的示例转储是:
ScreenSaverEngine[1678:6807] client is <_NSCFURLProtocolBridge 0x20025ab00> {NSURLProtocol 0x200258ec0, CFURLProtocol 0x20029c400}
ScreenSaverEngine(1678,0x102eda000) malloc: reference count underflow for 0x20025ab00, break on auto_refcount_underflow_error to debug.
你可以看到下溢发生在<_NSCFURLProtocolBridge 0x20025ab00>
.
当我 break onauto_refcount_underflow_error
时,似乎堆栈跟踪回到URLProtocolDidFinishLoading:
:
id client = [self client];
...
[client URLProtocolDidFinishLoading:self];
这个问题好像有一段时间了,但是网上好像完全没有答案:
http://lists.apple.com/archives/cocoa-dev/2008/May/msg01272.html http://www.cocoabuilder.com/archive/message/cocoa/2007/12/17/195056
该错误仅在这些列出的错误的垃圾收集环境中显示。关于如何在不引起内存问题的情况下解决此问题的任何想法?我假设这可能与 NSURLProtocol 下的 CF 类型被不当释放有关?