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
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
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() –