Le informazioni di base sono le NSURLProtocol
personalizzate. In startLoading
, [self client]
è di tipo:Come evitare l'underflow del conteggio dei riferimenti in _NSCFURLProtocolBridge in NSURLProtocol personalizzato in ambiente GC
<_NSCFURLProtocolBridge> {NSURLProtocol, CFURLProtocol}
Il problema è in esecuzione questo in un ambiente garbage collection. Perché sto scrivendo uno screensaver, sono costretto a renderlo garbage-collected. Tuttavia, il protocollo _NSCFURLProtocolBridge sembra gettare sempre:
malloc: reference count underflow for (memory_id_here), break on auto_refcount_underflow_error to debug
Un esempio discarica alla console di 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.
Si può vedere che l'underflow si verifica per <_NSCFURLProtocolBridge 0x20025ab00>
.
Quando rompo il auto_refcount_underflow_error
, sembra per impilare-trace di nuovo fino a URLProtocolDidFinishLoading:
in:
id client = [self client];
...
[client URLProtocolDidFinishLoading:self];
Questo problema sembra essere esistito per un po ', ma non sembra esserci nessuna risposta a tutti on-line:
http://lists.apple.com/archives/cocoa-dev/2008/May/msg01272.html http://www.cocoabuilder.com/archive/message/cocoa/2007/12/17/195056
Il bug si manifesta solo in ambienti garbage collection per questi bug elencati pure. Qualche idea su come posso aggirare questo senza causare problemi di memoria? Presumo che questo probabilmente ha qualcosa a che fare con il tipo di CF sotto NSURLProtocol che viene rilasciato in modo improprio?
Un'immagine della traccia dello stack: http://img.skitch.com/20090711-qbt4s4jq87jk4g68iaawe7h1hg.png –