【发布时间】:2015-01-24 21:56:16
【问题描述】:
我是 Instruments 的新手,但我之前已经成功地发现了漏洞。这一次,不是这样——每次我调用这段代码时都会有 34MB 的泄漏! 我尝试在下面发布所有相关代码,同时剪掉 DDLogging 等内容......
首先,显示问题的 Instruments 屏幕截图。请注意,我尝试模拟内存警告并等待一段时间,但没有任何变化——此内存被永久占用。
PhotoManager.m:
- (void)saveImage:(UIImage*)unimage completionBlock:(void(^)(BOOL success, NSError *error))completionBlock {
__weak typeof(self) weakSelf = self;
dispatch_block_t work = ^{
__block UIImage* image = [[AirprintCollagePrinter singleton] fixRotation:unimage];
// if trial mode, always downsize and watermark image
if( [PurchaseHelper singleton].getPurchaseLevel == PurchaseLevelTrial ) {
dispatch_sync(_photoManagerQueue, ^{
if( image.size.height > 1800 || image.size.width > 1200 ) {
image = [[AirprintCollagePrinter singleton] fitImage:image scaledToFillSize:CGSizeMake(1200, 1800)];
}
image = [weakSelf imageWithWatermark:image withWatermark:_watermarkImage];
});
}
<snip>
};
if( [[NSThread currentThread] isMainThread] )
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), work);
else
work();
}
从 Instruments 的屏幕截图中,您可以看到 AirprintCollagePrinter:fitImage 是我在跟踪中的代码的最后一部分,所以这是:
AirprintCollagePrinter.m:
- (UIImage *)fitImage:(UIImage *)image scaledToFillSize:(CGSize)size {
// do not upscale
@autoreleasepool {
if( image.size.width <= size.width && image.size.height <= size.height )
return image;
CGFloat scale = MIN(size.width/image.size.width, size.height/image.size.height);
CGFloat width = image.size.width * scale;
CGFloat height = image.size.height * scale;
CGRect imageRect = CGRectMake(0,
0,
width,
height);
UIGraphicsBeginImageContextWithOptions(size, YES, 0);
[image drawInRect:imageRect];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
}
...我记得结束我的图像上下文并将其包装在自动释放池中...我错过了什么?
【问题讨论】:
-
这个问题是在真机还是模拟器上?模拟器往往存在真实设备上不存在的泄漏。在真机上测试。
-
在 ipad air 上运行 iOS 8.1.2
标签: ios objective-c memory-leaks