使用 NSData 分配 Iphone
我有一种方法可以从互联网下载许多图像,然后将它们保存到设备上。这是代码:
-(IBAction) updateImages {
for (x=0; x<[imagesToUpdate count]; x=x+1) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSMutableDictionary *tempDic = [dic objectForKey:[imagesToUpdate objectAtIndex:x]];
BOOL newDictionary = [self downloadChartForDictionary:tempDic];
[pool drain];
}
}
-(BOOL) downloadChartForDictionary:(NSMutableDictionary *)dictionary {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSMutableDictionary *updatedDictionary = [NSMutableDictionary dictionaryWithDictionary:dictionary];
NSString *downloadString = [NSString stringWithFormat:@"http://www.photo.com/%@_0001.jpg",[updatedDictionary objectForKey:@"PDFName"]];
[updatedDictionary setObject:serverAIRAC forKey:@"airac"];
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"MM-dd-y";
NSString *dateString = [formatter stringFromDate:date];
[updatedDictionary setObject:dateString forKey:@"date"];
[formatter release];
NSURL *url = [NSURL URLWithString:downloadString];
NSData *data = [NSData dataWithContentsOfURL:url];
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *savePath = [NSString stringWithFormat:@"%@/%@^%@_%@.jpg",docsPath,serverAIRAC,[updatedDictionary objectForKey:@"airport"],[updatedDictionary objectForKey:@"PDFName"]];
BOOL downloaded = [data writeToFile:savePath atomically:YES];
[pool drain];
return YES;
}
我的问题是,当它运行时,NSData 对象数据被分配但从未释放,即使 updateImages 方法完成也是如此。在仪器中,下载的每个图像都保持分配状态。随着每个图像的下载,总分配量持续增加,最终出现内存不足崩溃。然而,Instruments 不会报告与该对象相关的泄漏。
我尝试过: [[NSData alloc]initWithContentsOfURL:url] 然后释放它,但这没有帮助。
我尝试将自动释放池仅放在 updateImages 方法中,并且仅放在 downloadChartForDictionary 方法中,但都没有帮助。
我一整天都被困在这个问题上,所以非常感谢您的帮助
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您是否尝试过
[[[NSData alloc]initWithContentsOfURL:url] autorelease]
?这会将 NSData 对象放入当前的自动释放池中。简单的分配/初始化创建仍然需要您的显式管理。Did you try
[[[NSData alloc]initWithContentsOfURL:url] autorelease]
? That will put the NSData object into the current autorelease pool. A straightforward alloc/init creation will still require your explicit management.尝试使用 dataWithContentsOfURL:options:error: 具有不同的阅读选项。我将从 NSDataReadingUncached,因为听起来你的数据在你不希望它被缓存的时候被缓存了。
Try using dataWithContentsOfURL:options:error: with different reading options. I would start with NSDataReadingUncached, because it sounds like your data is being cached when you don't want it to be.
这实际上不是问题......出于某种原因,仪器正在报告分配,但当我实际运行该应用程序时,它从未崩溃。
this was actually a non-issue... For some reason instruments was reporting the allocations, but when I actually ran the app, it never crashed.