【发布时间】:2014-07-09 12:14:48
【问题描述】:
我在内存管理方面遇到了一个奇怪的问题,这让我很抓狂。我需要异步预加载图像。我有代码
- (void)preloadFinishAnimation
{
self.animationImages = [NSMutableArray new];
__weak LearningViewController *weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < NUMBER_OF_ANIMATION_FRAMES; i++) {
UIImage *problemImage = [UIImage imageNamed:[NSString stringWithFormat:@"success-%d", i]];
[weakSelf.animationImages addObject:[weakSelf renderedImageFromImage:image]];
problemImage = nil;
}
});
}
- (UIImage *)renderedImageFromImage:(UIImage *)image
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
[image drawInRect:rect];
UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return renderedImage;
}
我检查了 Instruments,我知道 issueImage 不会释放内存。这是问题图像之一的保留/释放命令。
希望有人知道问题出在哪里!
【问题讨论】:
-
第一个细节,相信大家都想知道,是:你在用ARC吗?
-
另外,分配摘要不是显示图像已发布吗?在我看来,每个保留都有一个版本。
-
首先,如果您使用 ARC,则无需担心 renderImage 实例。否则,您需要在 renderImageFromImage 方法中自动释放此引用。
-
我正在使用 ARC。不,它没有发布。在最后一行的分配摘要中,RefCt 是 1。我只寻找活动对象。
-
imageNamed:加载的所有图片都被框架缓存以提高性能。如果你用同名调用两次imageNamed:更重要的是,内存将在这两个对象之间共享。
标签: ios objective-c memory-management memory-leaks objective-c-blocks