[英]iOS - ARC/Memory management issues with ModalViewControllers
[英]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.