Lo básico es que tengo un NSURLProtocol
personalizado. En startLoading
, [self client]
es de tipo:Cómo evitar el desbordamiento de recuento de referencias en _NSCFURLProtocolBridge en NSURLProtocolo personalizado en el entorno de GC
<_NSCFURLProtocolBridge> {NSURLProtocol, CFURLProtocol}
El problema se está ejecutando esto en un ambiente de recolección de basura. Debido a que estoy escribiendo un salvapantallas, me veo obligado a hacerlo recolectar basura. Sin embargo, el protocolo _NSCFURLProtocolBridge parece siempre tirar:
malloc: reference count underflow for (memory_id_here), break on auto_refcount_underflow_error to debug
Un ejemplo de volcado para la consola de depuración es:
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.
Se puede ver que el underflow ocurre para <_NSCFURLProtocolBridge 0x20025ab00>
.
Cuando romper el auto_refcount_underflow_error
, parece que apilar-rastreo hacia atrás hasta URLProtocolDidFinishLoading:
en:
id client = [self client];
...
[client URLProtocolDidFinishLoading:self];
Este problema parece haber existido durante un tiempo, pero no parece haber ninguna respuesta en línea:
http://lists.apple.com/archives/cocoa-dev/2008/May/msg01272.html http://www.cocoabuilder.com/archive/message/cocoa/2007/12/17/195056
El fallo sólo se manifiesta en los entornos de basura-recogida para estos fallos en la lista así. ¿Alguna idea sobre cómo puedo evitar esto sin causar problemas de memoria? Supongo que esto probablemente tiene algo que ver con el tipo CF debajo de NSURLProtocol que se lanzó incorrectamente.
Una imagen de la traza de la pila: http://img.skitch.com/20090711-qbt4s4jq87jk4g68iaawe7h1hg.png –