Вопрос по ios6, iphone-privateapi, ios5, ios, ios4 – Выпуск IOSurface

7

Этот вопрос является дополнением к:

Link-1:Создание изображения из поверхности ios и сохранение его

Link-2:Делать скриншоты из iOS-приложения - эмулировать дисплей-рекордер (запрос по внутренним компонентам)

(Ссылка Ссылка-1) У меня есть код для снятия скриншотов в фоновом режиме. Но, как указано, для непрерывной работы требуется 2 секунды бездействия, в противном случае ОС приостанавливает работу приложения. Я выяснил причину, может быть, я не выпускаю явно IOSurface, который я создаю.

Причина - Использование ссылкиhttp://pastie.org/pastes/3734430 По словам Виктора Ронина, захват отлично работает даже без сна. Я попытался освободить destSurf (созданную мной поверхность назначения) с помощью CFRelease после того, как я каждый раз записываю изображение, но это нет работа.

Любая помощь, когда, как и нужно ли выпускать созданную IOSurface, будет действительно полезна. Благодарю.



Обновить

Итак, именно это и происходит. (Ссылка на ссылку-1)

IOSurfaceRef destSurf = IOSurfaceCreate(dict);
IOSurfaceAcceleratorRef outAcc;
IOSurfaceAcceleratorCreate(NULL, 0, &outAcc);

CFDictionaryRef ed = (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: nil];
IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, ed, NULL);

IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed);

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width*height*4), NULL);
CGImageRef cgImage=CGImageCreate(width, height, 8, 8*4, IOSurfaceGetBytesPerRow(destSurf), CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, provider, NULL, YES, kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage: cgImage];
CGImageRelease(cgImage);
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
CFRelease(destSurf);
Происходит вызов CFRelease, и приложение вылетает. Нет сохраненных изображений. Тем не менее, если вы положили в сон 1-2 секунды до релиза, он работает нормально.Если вы пропустите вызов UIImageWriteToSavePhotosAlbum (), все работает нормально, и захват идет без перерыва.

Мне до сих пор не ясно, в чем именно заключается проблема и как ее решить. Любая помощь высоко ценится.

Ваш Ответ

1   ответ
3

создается с помощью API IOSurfaceCreate, который неуправляемый авто-выпускомs.

В качестве примера я нашел следующий код, где онs выпущено:

https://www.google.com/url?sa=t&RCT = J &д = &ESRC = s &Источник = веб-кд = 8 &CAD = RJA &вед = 0CF0QFjAH &URL = HTTP% 3A% 2F% 2Fcode.google.com% 2FP% 2Fsyphon-база% 2Fsource% 2Fbrowse% 2Ftags% 2Fpublic-бета-1% 2FSyphonServer.m% 3fr% 3D3 &е = i_zRUMWQDMqw0AHs7IHYDA &USG = AFQjCNG9yO3sUf-ZQy-W_h_Q9WJMm4hqgw

http://www.opensource.apple.com/source/WebCore/WebCore-7536.24/platform/graphics/surfaces/mac/GraphicsSurfaceMac.cpp?txt

Что произойдет, если вы попытаетесь выпустить его с CFRelease? Это происходит сбой или у него та же проблема с 2 секундами?

Я проверю оба из них и вернусь к вам. Кроме того, просто чтобы уточнить, если RetainCount равен 1, это будет означать, что я не могу освободить объект? Что мне делать в этом случае? Hrishikesh_Pardeshi
@Hrishikesh_Pardeshi, как вы сами описали проблему, ее легко исправить с помощью освобождения поверхности в селекторе завершения, в справочнике UIKit упоминается асинхронная обработкаUIImageWriteToSavedPhotosAlbum так что крушение ожидается. A-Live
Я рекомендую прочитать это:stackoverflow.com/questions/6578/... (Это'довольно большой и сложный предмет) Victor Ronin
Благодарю. Приложение вылетает, если я использую CFRelease с поверхностью, которую создаю. Однако, если я использую это на поверхности экрана, я взял из IOMobileBufferGetLayerDefaultSurface. Hrishikesh_Pardeshi

Похожие вопросы