Я пытаюсь отобразить экран моего mac на iphone. У меня есть этот метод в делегате приложения Mac для захвата screeen в строку base64.Проблемы с памятью с ARC на iOS и Mac
-(NSString*)baseString{
CGImageRef screen = CGDisplayCreateImage(displays[0]);
CGFloat w = CGImageGetWidth(screen);
CGFloat h = CGImageGetHeight(screen);
NSImage * image = [[NSImage alloc] initWithCGImage:screen size:(NSSize){w,h}];
[image lockFocus];
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, w, h)];
[bitmapRep setCompression:NSTIFFCompressionJPEG factor:.3];
[image unlockFocus];
NSData *imageData = [bitmapRep representationUsingType:NSJPEGFileType properties:_options];
NSString *base64String = [imageData base64EncodedStringWithOptions:0];
image = nil;
bitmapRep = nil;
imageData = nil;
return base64String;}
после этого отправлю на iphone и представим его в UIImageView. Задержка между снимками экрана составляет 40 миллисекунд. Все работает так, как ожидается, пока не будет достаточно памяти. По истечении минуты потоковой передачи он начинает заменять и использовать 6 ГБ оперативной памяти. Использование памяти приложений iOS также растет линейно. К тому моменту, когда iOS достигает 90 МБ оперативной памяти, Mac имеет 6 ГБ. Даже если я остановку потоковой памяти не освобождается. Я использую ARC в обоих проектах. Не имеет значения, перенося ли его на ручной подсчет ссылок?
Я также пробовал блок @autoreleasepool {...}, но это не помогло.
Любые идеи?
EDIT
Мой IOS код здесь
NSString message = [NSString stringWithFormat:@"data:image/png;base64,%@",base64];
NSURL *url = [NSURL URLWithString:message];
NSData *imageData = [NSData dataWithContentsOfURL:url];
UIImage *ret = [UIImage imageWithData:imageData];
self.image.image = ret;
Вы прочитали документы для 'CGDisplayCreateImage'? – rmaddy
Я использовал образец кода Apple для захвата экрана, хотя, хотя NSData вызывал утечки – Heisenbug
'NSData' будет автореализован. – rmaddy