在iOS和Mac上使用ARC的内存问题

时间:2015-11-20 16:15:18

标签: objective-c macos memory-management screen

我正在尝试将我的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;

2 个答案:

答案 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对象具有特殊的释放调用。对于那些不打算的人,只需致电CGDisplayCreateImageCFRelease有一个特殊的发布呼叫CGImageRef

您可能需要拨打CGImageRelease(),这可能是在致电CGImageRelease(screen)之后。