我正在尝试将我的Mac屏幕镜像到iphone。我在Mac app委托中有这个方法来捕获screeen到base64字符串。
-(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毫秒。一切都按预期工作,直到有足够的内存。一分钟的流媒体后,它开始交换并使用6GB的RAM。 iOS应用程序内存使用量也在增长。当iOS达到90MB的内存时,mac有6GB。 即使我停止流媒体内存也没有发布。 我在两个项目中都使用ARC。将它迁移到手动引用计数会有什么不同吗? 我也尝试了@autoreleasepool {...}块,但它没有帮助 有什么想法吗?
修改
我的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;
答案 0 :(得分:1)
你有严重的内存泄漏。 CGDisplayCreateImage
的文档明确指出:
调用者负责释放通过调用CGImageRelease创建的图像。
通过致电:
更新您的代码CGImageRelease(screen);
我在创建NSImage
之后添加它。
答案 1 :(得分:1)
由于您没有发布iOS代码,我们无法帮助您解决iOS内存泄漏问题,但我发现Mac代码中存在大量内存泄漏。
您正在调用Core Foundation函数size_t
。 Core Foundation对象不由ARC管理。如果Core Foundation功能具有" Create" (或" copy")在名称中,它跟随" create rule"并且你负责在完成后释放返回的CF对象。
某些CF对象具有特殊的释放调用。对于那些不打算的人,只需致电CGDisplayCreateImage
。 CFRelease
有一个特殊的发布呼叫CGImageRef
。
您可能需要拨打CGImageRelease()
,这可能是在致电CGImageRelease(screen)
之后。