У меня есть пользовательский 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>
происходит недополнение.
Когда я прерываю auto_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
Ошибка также проявляется в средах, собранных для мусора, для этих перечисленных ошибок. Любые мысли о том, как я могу обойти это, не вызывая проблем с памятью? Я предполагаю, что это, вероятно, связано с тем, что тип CF под NSURLProtocol выпущен ненадлежащим образом?