2009-06-01 10 views
1

Ce morceau de code a été séparé d'un projet sur lequel je travaille. Il reproduit systématiquement une erreur de garbage collection sur mon Mac OS 10.5.7 et se bloque parfois. Je l'ai regardé pendant trop longtemps alors ma question est: est-ce que quelqu'un d'autre voit pourquoi cela donnerait des erreurs quand la collecte des ordures est allumée?Crash Collection Garbage utilisant NSImage

- (void) doCrash: (id) sender 
{ 
    NSArray *lURLArray = [ NSArray arrayWithObjects: 
          @"http://userserve-ak.last.fm/serve/300x300/23621007.jpg", 
          @"http://userserve-ak.last.fm/serve/300x300/26675609.png", 
          @"http://userserve-ak.last.fm/serve/300x300/26675609.png", 
          nil ]; 
    NSString *lImageURL = nil; 
    for (lImageURL in lURLArray) 
    { 
     NSImage *lImage = [[NSImage alloc] initWithContentsOfURL: [NSURL URLWithString: lImageURL]]; 

     NSSize targetSize = NSMakeSize(80,80); 
     NSImage *newImage = [[NSImage alloc] initWithSize:targetSize]; 
     [newImage lockFocus]; 

     NSRect thumbnailRect = NSMakeRect(0,0,80,80); 
     NSRect sourceRect = NSMakeRect(0,0,[lImage size].width,[lImage size].height); 

     [lImage drawInRect: thumbnailRect 
        fromRect: sourceRect 
       operation: NSCompositeSourceOver 
        fraction: 1.0];     

     [newImage unlockFocus]; 
    } 
} 

Quand jouer avec les URL dans le lURLArray j'obtenir un comportement différent: plante parfois, parfois le message d'erreur.

Le message d'erreur de collecte des ordures est déclenché lorsque le garbage collector libère l'une des images et va comme ceci:

reference count underflow for <address>, break on auto_refcount_underflow_error to debug. 

Toute aide est très appréciée, grâce, Kristof

+0

Vous n'avez pas dit; avez-vous défini un point d'arrêt sur auto_refcount_underflow_error pour voir quand/où cela se produit? – Abizern

+1

J'ai quand même dit: "quand le garbage collector libère l'une des images". Trace de la pile: # 0 auto_refcount_underflow_error() # 1 Auto :: Zone :: dec_refcount_small_medium() # 2 Auto :: Zone :: block_decrement_refcount() # 3 CFRelease() # 4 - [NSBitmapImageRep _freeData] () # 5 - [NSBitmapImageRep _freeImage]() # 6 - [NSBitmapImageRep finaliser]() # 7 finalizeOneObject() # 8 foreach_block_do() # 9 batchFinalize() # 10 batchFinalizeOnMainThread() # 11 objc_collect_if_needed () # 12 NSPopAutoreleasePool() –

Répondre

2

Cela a été confirmé par quelqu'un d'Apple comme un bug dans OX X 10.5.7.

rdar: // problème/6938657