【发布时间】:2015-03-16 21:11:21
【问题描述】:
我正在使用以下方法为数组中的艺术家下载图像。我使用LastFm 获取图像,然后将它们存储在ESCache。
self.imageDownloadingQueue = [[NSOperationQueue alloc] init];
self.imageDownloadingQueue.maxConcurrentOperationCount = 1;
self.artworkCache = [[ESCache alloc] initWithName:@"artworkCache" error:nil];
NSArray *artists = // get artists using relevant framework;
for (MPMediaItemCollection *collection in artists){
[self.imageDownloadingQueue addOperationWithBlock:^{
@autoreleasepool {
MPMediaItem *item = [collection representativeItem];
NSString *artistString = [item valueForProperty:MPMediaItemPropertyAlbumArtist];
BOOL isCachedImage = [self.artworkCache objectExistsForKey:artistString];;
if (!isCachedImage){
[[LastFm sharedInstance] getInfoForArtist:artistString successHandler:^(NSDictionary *result) {
if ([artistString isEqualToString:[[result objectForKey:@"_params"] objectForKey:@"artist"]]) {
NSURL *imageURL = [result objectForKey:@"image"];
if (imageURL){
NSData * data = [NSData dataWithContentsOfURL:imageURL];
UIImage *artistImage = [UIImage imageWithData:data];
[self.artworkCache setObject:artistImage forKey:artistString];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[downloadButton setTitle:artistString forState:UIControlStateNormal];
[downloadButton setBackgroundImage:artistImage forState:UIControlStateNormal];
}];
artistImage = nil;
}
else{
UIImage *newArtworkImage = // get placeholder image;
if (newArtworkImage != nil){
[self.artworkCache setObject:newArtworkImage forKey:artistString];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[downloadButton setTitle:artistString forState:UIControlStateNormal];
[downloadButton setBackgroundImage:newArtworkImage forState:UIControlStateNormal];
}];
newArtworkImage = nil;
}
}
}
else{
}
} failureHandler:^(NSError *error) {
}];
}
}
}];
}
我在 Xcode 中看到我的内存使用量增加到刚刚超过 200mb,然后我的应用程序崩溃并出现以下错误:
2015-01-18 20:56:36.479 Mezzo[1481:39314] 收到内存警告。 Mezzo(1481,0x105254000) malloc: * mach_vm_map(size=147456) 失败 (错误代码=3) * 错误:无法分配区域 *** 在 malloc_error_break 中设置断点进行调试
它遍历前 50 位左右的艺术家,获取他们的图像(我可以看到 downloadButton 发生变化),但随后它崩溃了。我不确定如何处理不断增加的内存使用问题。存储图像后,我将图像设置为nil,并将所有内容放入autoreleasepool。
当它循环通过这个数组时,我还能如何减少内存使用?任何帮助将非常感激。谢谢。
【问题讨论】:
标签: ios objective-c iphone memory-management automatic-ref-counting