Les bases sont que j'ai un Le problème est en cours d'exécution dans un environnement recueilli à la poubelle. Parce que je suis écrit un économiseur d'écran, je suis obligé de le faire des ordures recueillies. Cependant, le protocole _nscurlprotocolbridge semble toujours lancer: P> Un exemple de vidage à la console de débogage est le suivant: P> Vous pouvez voir que le sous-fluide se produit pour lorsque je cas sur nsurlprotocol code>. Dans
Startoading code>,
[Auto-client] code> est de type:
MALLOC: sous-fluide de référence de référence pour (memory_id_here), casser sur auto_refcount_underflow_error à déboguer code> p>
blockQuote>
Screensaverengine [1678: 6807] est <_nscfurlprotocolbridge> {nsurlprotocol 0x200258ec0, cfurlprotocol 0x20029c400} code>
ScreensavenEgine (1678,0x102eda000) MALLOC: Inférieur de négociation pour 0x20025AB00, pause sur auto_refcount_underflow_error à déboguer. Code> P>
blockQquote>
<_ nscfurlprotocolbridge> code>. p>
auto_refcount_underflow_error code>, il semble que Stack-trace Sauvegardez jusqu'à
URLProtOColdFinishloading: Code> In: P>
id client = [self client];
...
[client URLProtocolDidFinishLoading:self];
6 Réponses :
Cette erreur indique généralement qu'un objet a été conservé avec Le reste de ceci est tourné dans le noir .... p> Vous pouvez obtenir un aperçu en intensifiant la pile et en consultant les paramètres qui sont passés à ces méthodes C ++ (ou en particulier et voir si vous pouvez obtenir une idée de l'objet adopté. Peut-être que cela fonctionnera si vous êtes chanceux: p> -Retain code>, mais publié avec
cfrelease () code>. Si vous croyez que cela ne pourrait pas être votre objet (et ce n'est pas une croyance terrible), vous devriez alors ouvrir un autre radar. Mais vous devriez d'abord regarder autour de vous et voir s'il y a un objet CF que vous utilisez
-Retain code> sur lorsque vous devriez peut-être utiliser
cfretain () code>.
auto_zone_release code> ). Essayez ceci dans gdb pour essayer de voir ce qui est dans le premier paramètre: p>
Rob - dans un environnement de GC, n'appelle pas-retentit Notops? Je pense que c'est un bug et je vais ouvrir un bogue radar à ce sujet. Merci!
-Retain est un noop en GC, mais cfretain () n'est pas. Donc, si vous appelez -retain, puis cfrelease (), vous serez déséquilibré.
C'est un bug dans la mise en œuvre de _nscfurlprotocolbridge. p>
Veuillez utiliser http://bugrepor.apple.apple.com/ et déposer un bug. Si vous incluez l'URL sur cette page, cela serait apprécié (et si vous mettez à jour cette page avec le # radar #, cela serait apprécié, aussi). Idéalement, si vous pouvez joindre un binaire de votre économiseur d'écran, cela serait très utile; Aucune source nécessaire. P>
Heureusement, cela ne devrait pas causer de crash. Malheureusement, cela provoque probablement une fuite. P>
Dernière WWDC, nous avons confirmé ce bogue avec un ingénieur WebKit, il pouvait voir le bogue ici dans le code, j'espère donc qu'ils le répareront. La solution de contournement consiste à cfrétiser le client dans la méthode initwithrequest.
- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id <NSURLProtocolClient>)client { // work around for NSURLProtocol bug // note that this leaks! CFRetain(client); if (self = [super initWithRequest:request cachedResponse:cachedResponse client:client]) { } return self; }
J'ai travaillé autour de ce numéro par cfretain code> - -ing du client et
cflelease code> à nouveau sur l'appel suivant sur
startoading code>
-(void)finalize
{
if ( client ) CFRelease(client);
[super finalize];
}
Voici le rapport de bogue que j'avais déposé un moment: p>
http://openradar.appot.com/8087384 p>
Vaut probablement la peine de dépôt, il a déjà été dup-ed, mais ce serait bien de le faire réparer. P>
Comme Alex l'a dit, un développeur Apple a examiné le code source devant moi et localisé le problème facilement avec l'exemple que nous avions. P>
Ce bogue a été fermé comme une dupe de RDAR: // 8070298, qui semble être fixée au lion.
La même erreur vient parfois à l'aide de NSURL dans le filtre de la boîte de dialogue Ouvrir. Pour moi, il suffisait de le mettre à nulle explicitement après que je n'en ai plus besoin. P>
Une image de la pile trace: img.skitch.com/20090711-QBT4S4JQ87JK4G68IAAWE7H1HG.PNG