繁体   English   中英

iOS和Mac上ARC的内存问题

[英]Memory issues with ARC on iOS and Mac

我正在尝试将Mac的屏幕镜像到iPhone。 我在Mac应用程序委托中有此方法来将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达到ram的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;

您有严重的内存泄漏。 CGDisplayCreateImage的文档明确指出:

调用者负责释放通过调用CGImageRelease创建的图像。

通过调用以下代码来更新代码:

CGImageRelease(screen);

我将在创建NSImage之后添加它。

由于您未发布iOS代码,因此我们无法帮助您解决iOS内存泄漏的问题,但是我发现Mac代码中内存泄漏很大。

您正在调用Core Foundation函数CGDisplayCreateImage 核心基础对象不受ARC管理。 如果Core Foundation函数的名称中包含“创建”(或“副本”),则它遵循“ 创建规则 ”,并且您有责任在完成后释放返回的CF对象。

一些CF对象具有特殊的释放调用。 对于那些没有的,只需调用CFRelease CGImageRef有一个特殊的释放调用CGImageRelease()

您可能需要在调用initWithCGImage之后对CGImageRelease(screen)进行相应的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM