gpt4 book ai didi

ios - 由于多线程代码导致内存压力而终止

转载 作者:行者123 更新时间:2023-11-29 03:29:53 24 4
gpt4 key购买 nike

我的应用程序在使用过程中的某个时刻由于内存压力而终止,我已将问题隔离为导致问题的一段代码。

我将复制下面的代码(我已经通过注释掉这段代码并运行应用程序进行了测试,应用程序运行良好)。

我在这里要做的是:我正在阅读 RSS 提要,获取图像的 URL 并将其显示在 tableView 单元格中。下面的代码来自 cellForRowAtIndexPath。

// 1. Check the image cache to see if the image already exists. If so, then use it. If not, then download it.
if ([[ImageCache sharedImageCache] DoesExist:imgSrcString] == true)
{
cell.cellImageView.image = [[ImageCache sharedImageCache] GetImage:imgSrcString];
} else {
cell.cellImageView.image = [UIImage imageNamed:@"NoImage_Small"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
// Now, we can’t cancel a block once it begins, so we’ll use associated objects and compare
// index paths to see if we should continue once we have a resized image.
objc_setAssociatedObject(cell,
kIndexPathAssociationKey,
indexPath,
OBJC_ASSOCIATION_RETAIN);

dispatch_async(queue, ^{
NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgSrcString]];
UIImage *image = [UIImage imageWithData:imageData];
//UIImage *resizedImage = [image scaleToSize:CGSizeMake(71.0f,71.0f)] ; //[UIImage resizeImage];
dispatch_async(dispatch_get_main_queue(), ^{
NSIndexPath *cellIndexPath =
(NSIndexPath *)objc_getAssociatedObject(cell, kIndexPathAssociationKey);
if(image){
if ([indexPath isEqual:cellIndexPath]) {
[[cell cellImageView] setImage:image];
[[ImageCache sharedImageCache] AddImage:imgSrcString :image];
}
}

// [[ImageCache sharedImageCache] AddImage:[imgSrcString stringByAppendingString:@"bigImage"] :image];
});
});
}

如果能帮我指明正确的方向,我们将不胜感激。感谢您的宝贵时间!

最佳答案

关于这个问题我已经上网了。顺便说一句,在一些博客中他们提到默认 NSURLConnection 包含根本不清楚的缓存。这可能就是坠机的原因。所以尝试使用 ASIHTTPRequest http://allseeing-i.com/ASIHTTPRequest/那么你就永远不会感觉到有关图像下载的内存警告。

使用此代码进行 ASIHTTPRequest 集成(添加 sdk 文件后)

-(void)resetNetworkQueue
{
// initialising network queue.
self.networkQueue =[[ASINetworkQueue alloc]init];

[self.networkQueue setRequestDidFinishSelector:@selector(mediaDownloadCompleted:)];
[self.networkQueue setRequestDidFailSelector:@selector(mediaDownloadFailed:)];
[self.networkQueue setRequestDidStartSelector:@selector(mediaDownloadStarted:)];
[self.networkQueue setQueueDidFinishSelector:@selector(networkQueueCompletedProcess:)];
[self.networkQueue setMaxConcurrentOperationCount:10];
[self.networkQueue setShouldCancelAllRequestsOnFailure:NO];

[self.networkQueue setDelegate:self];

}


-(void)createDownloadRequest
{
//Adding request in network queue.
self.request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:imageURL]];
[self.request setDownloadDestinationPath:downloadDestinationPath];
[self.request setDelegate:self];
[self.request setAllowResumeForFileDownloads:YES];
[self.request setTimeOutSeconds:30];
[self.networkQueue addOperation:self.request];
[self.request setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:homeInfo,@"FloorPlanInfo",imageType,@"ImageType", nil]];
}



- (void)mediaDownloadStarted:(ASIHTTPRequest *)request
{
//Fire when request started.
}
- (void)mediaDownloadCompleted:(ASIHTTPRequest *)request
{

//Fire when request completed.
}
- (void)mediaDownloadFailed:(ASIHTTPRequest *)request
{
//Fire when request Failed to download.
}

关于ios - 由于多线程代码导致内存压力而终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19945277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com