11
votes

Comment éviter le débit de référence de référence dans _nscfurlprotocolbridge dans le nsurlprotocol personnalisé dans GC Environnement

Les bases sont que j'ai un nsurlprotocol code>. Dans Startoading code>, [Auto-client] code> est de type: xxx pré>

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>

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>

Un exemple de vidage à la console de débogage est le suivant: P>

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>

Vous pouvez voir que le sous-fluide se produit pour <_ nscfurlprotocolbridge> code>. p>

lorsque je cas sur auto_refcount_underflow_error code>, il semble que Stack-trace Sauvegardez jusqu'à URLProtOColdFinishloading: Code> In: P>

id client = [self client];
...
[client URLProtocolDidFinishLoading:self];


1 commentaires

6 Réponses :


1
votes

Cette erreur indique généralement qu'un objet a été conservé avec -Retain , mais publié avec cfrelease () . 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 sur lorsque vous devriez peut-être utiliser cfretain () .

Le reste de ceci est tourné dans le noir ....

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 auto_zone_release ). Essayez ceci dans gdb pour essayer de voir ce qui est dans le premier paramètre: xxx

et voir si vous pouvez obtenir une idée de l'objet adopté. Peut-être que cela fonctionnera si vous êtes chanceux: xxx


2 commentaires

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é.



3
votes

C'est un bug dans la mise en œuvre de _nscfurlprotocolbridge.

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.

Heureusement, cela ne devrait pas causer de crash. Malheureusement, cela provoque probablement une fuite.


0 commentaires

4
votes

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;
}


0 commentaires

1
votes

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];
}


0 commentaires

1
votes

Voici le rapport de bogue que j'avais déposé un moment:

http://openradar.appot.com/8087384

Vaut probablement la peine de dépôt, il a déjà été dup-ed, mais ce serait bien de le faire réparer.

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.


1 commentaires

Ce bogue a été fermé comme une dupe de RDAR: // 8070298, qui semble être fixée au lion.



0
votes

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.


0 commentaires