Похоже, это классический метод сканирования изображений с iPhone. У меня есть поток, который отправляется из основного потока для поиска кодов. По сути, он каждый раз создает новый UIImage, а затем удаляет его.
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];
проблема в том, что [выпуск пула] вызывает ERROR_BAD_EXC (эта старая классика) и бомбы программы. Мне сказали, что нет необходимости вызывать [релиз uiimage], поскольку я явно не выделил UIImage, но, похоже, это не так. Если я уберу эту строку, использование памяти резко возрастет, и программа завершит работу из-за нехватки памяти. Похоже, я не могу иметь эту работу так, как мне хотелось бы.
Есть ли способ создать UIImage «на месте»? То есть есть буфер, который снова и снова записывается как UIImage? Я подозреваю, что это сработает?
Обновить!
Попытался выполнить связанные с UIKit вызовы в основном потоке следующим образом:
-(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);
}
Однако никакой радости, поскольку EXC_BAD_ACCESS поднимает свою уродливую голову, когда кто-то хочет захватить «Размер» UIImage