Cela semble être la méthode classique pour numériser des images à partir de l'iPhone. J'ai un fil qui est envoyé à partir du fil principal pour aller chercher des codes. Il crée essentiellement un nouveau UIImage à chaque fois puis le supprime.UIImage dans le thread n'est pas libéré/écrasé
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
{
while (![thread isCancelled]) {
#ifdef DEBUG
NSLog(@"Decoding Loop");
#endif
// [self performSelectorOnMainThread:@selector(updateImageBuffer) withObject:nil waitUntilDone:YES];
CGImageRef cgScreen = UIGetScreenImage();
UIImage *uiimage = [UIImage imageWithCGImage:cgScreen];
if (uiimage){
CGSize size = [uiimage size];
CGRect cropRect = CGRectMake(0.0, 80.0, size.width, 360); // Crop to centre of the screen - makes it more robust
#ifdef DEBUG
NSLog(@"picked image size = (%f, %f)", size.width, size.height);
#endif
[decoder decodeImage:uiimage cropRect:cropRect];
}
[uiimage release];
CGImageRelease(cgScreen);
}
}
[pool release];
le problème est que la [version de la piscine] provoque une ERROR_BAD_EXC (ce vieux classique) et les bombes de programme. On me dit qu'il n'est pas nécessaire d'appeler [uiimage] car je n'ai pas explicitement attribué un UIImage, mais cela ne semble pas être le cas. Si je sors cette ligne, l'utilisation de la mémoire passe à travers le toit et le programme quitte les cotisations dues au manque de mémoire. Il semble que je ne peux pas avoir ce travail comme je le voudrais.
Y at-il un moyen de créer un UIImage "in-place"? I.e, avez un tampon qui est écrit encore et encore comme un UIImage? Je soupçonne que cela fonctionnerait?
Mettre à jour!
Essayé l'exécution des appels liés à UIKit sur le thread principal comme suit:
-(void)performDecode:(id)arg{
// Perform the decoding in a seperate thread. This should, in theory, bounce back with a
// decoded or not decoded message. We can quit at the end of this thread.
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
{
while (![thread isCancelled]) {
#ifdef DEBUG
NSLog(@"Decoding Loop");
#endif
[self performSelectorOnMainThread:@selector(updateImageBuffer) withObject:nil waitUntilDone:YES];
if (uiimage){
CGSize size = [uiimage size];
CGRect cropRect = CGRectMake(0.0, 80.0, 320, 360); // Crop to centre of the screen - makes it more robust
#ifdef DEBUG
NSLog(@"picked image size = (%f, %f)", size.width, size.height);
#endif
[decoder decodeImage:uiimage cropRect:cropRect];
}
}
}
[pool drain];
#ifdef DEBUG
NSLog(@"finished decoding.");
#endif
}
-(void) updateImageBuffer {
CGImageRef cgScreen = UIGetScreenImage();
uiimage = [UIImage imageWithCGImage:cgScreen];
//[uiimage release];
CGImageRelease(cgScreen);
}
Pas de joie mais comme EXC_BAD_ACCESS dresse sa tête hideuse quand on veut saisir la « taille » du UIImage
Salut! Je l'ai mentionné dans le commentaire précédent mais merci pour le conseil avec Drain. La clé était de comprendre que les méthodes de commodité s'en tiennent à la libération automatique et que la libération anticipée ne fonctionne donc pas correctement. – Oni