大佬教程收集整理的这篇文章主要介绍了ios – 当我在滚动UITableview期间显示文档目录中的图像时,内存不断增加然后应用程序崩溃,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
下面是我从本地访问图像的代码,如果它不可用,那么它将下载然后显示.
[cell.imgProfilePic processImageDataWithURLString:cData.PICTURE];
我已经制作了自定义UIImageView类
DImageView.h
#import <UIKit/UIKit.h> @interface DImageView : UIImageView @property (nonatomic,strong) UIActivityInDicatorView *activityView; - (void)processImageDataWithURLString:(NSString *)urlString; + (UIImage *)getSavedImage :(NSString *)filename; @end
DImageView.m
#import "DImageView.h" #define IMAGES_FOLDER_NAME @"DImages" @implementation DImageView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self; } - (void)dealloc { self.activityView = nil; [super dealloc]; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self initWithFrame:[self frame]]; } return self; } - (void)processImageDataWithURLString:(NSString *)urlString { @autoreleasepool { UIImage * saveImg =[DImageView getSavedImage:urlString]; if (saveImg) { @autoreleasepool { dispatch_queue_t callerQueue = dispatch_get_main_queue(); dispatch_async(callerQueue,^{ @autoreleasepool{ [self setImage:saveImg]; } }); } } else { [self showActivityInDicator]; NSURL *url = [NSURL URLWithString:[urlString StringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; dispatch_queue_t callerQueue = dispatch_get_main_queue(); dispatch_queue_t downloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0); __block NSError* error = nil; dispatch_async(downloadQueue,^{ @autoreleasepool { NSData * imageData = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error]; if (!error) { dispatch_async(callerQueue,^{ @autoreleasepool { UIImage *image = [UIImage imageWithData:imageData]; [self setImage:image]; [self hideActivityInDicator]; [self saveImageWithFolderName:IMAGES_FOLDER_NAME AndFilename:urlString AndImage:imageData]; } }); } } }); dispatch_release(downloadQueuE); } } } - (void) showActivityInDicator { self.activityView = [[UIActivityInDicatorView alloc]initWithFrame:CGRectMake(0,self.frame.size.width,self.frame.size.height)]; self.activityView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; self.activityView.hidesWhenStopped = TRUE; self.activityView.BACkgroundColor = [UIColor clearColor]; self.activityView.activityInDicatorViewStyle = UIActivityInDicatorViewStyleGray; [self addSubview:self.activityView]; [self.activityView startAnimaTing]; } - (void) hideActivityInDicator { CAAnimation *animation = [NSClassFromString(@"CATransition") animation]; [animation SETVALue:@"kCATransitionFade" forKey:@"type"]; animation.duration = 0.4;; [self.layer addAnimation:animation forKey:nil]; [self.activityView stopAnimaTing]; [self.activityView removeFromSuperview]; for (UIView * view in self.subviews) { if([view isKindOfClass:[UIActivityInDicatorView class]]) [view removeFromSuperview]; } } - (void)saveImageWithFolderName:(NSString *)folderName AndFilename:(NSString *)filename AndImage:(NSData *) imageData { @autoreleasepool{ NSFileManager *filemanger = [[NSFileManager defaultManager] autorelease]; NSString *directoryPath = [[NSString StringWithFormat:@"%@/%@",[DImageView applicationDocumentsDirectory],folderName] autorelease]; if (![filemanger fileExistsAtPath:directoryPath]) { NSError *error = nil; [filemanger createDirectoryAtPath:directoryPath withIntermediateDirectories:YES attributes:nil error:&error]; } filename = [DImageView filenameValidate:filename]; NSString *filePath = [[NSString StringWithFormat:@"%@/%@",directoryPath,filename] autorelease]; BOOL isSaved = [imageData writeToFile:filePath atomically:YES]; if (!isSaved)DLog(@" ** Img Not Saved"); } } + (NSString *)applicationDocumentsDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *basePath = ([paths count] > 0) ? [paths objectATindex:0] : nil; return basePath; } + (UIImage *)getSavedImage :(NSString *)filename { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; filename = [DImageView filenameValidate:filename]; NSFileManager * filemanger = [[NSFileManager defaultManager] autorelease]; NSString * directoryPath = [[NSString StringWithFormat:@"%@/%@",[DImageView applicationDocumentsDirectory],IMAGES_FOLDER_NAME] autorelease]; NSString * filePath = [[NSString StringWithFormat:@"%@/%@",filename] autorelease]; if ([filemanger fileExistsAtPath:directoryPath]) { UIImage *image = [[[UIImage imageWithContentsOfFile:filePath] retain]autorelease]; if (imagE) return image; else return nil; } [pool release]; return nil; } + (NSString*) filenameValidate : (NSString*) name { name = [name StringByreplacingoccurrencesOfString:@"://" withString:@"##"]; name = [name StringByreplacingoccurrencesOfString:@"/" withString:@"#"]; name = [name StringByreplacingoccurrencesOfString:@"%20" withString:@""]; return name; } @end
一切正常,平滑滚动以及@L_874_9@的asyncImage下载.
问题是当我滚动UITableview时,应用程序内存不断增加,经过一段时间后,我得到了接收内存2/3时间然后应用程序崩溃.
当我使用AsyncImageView类时,内存不会增加并且其工作正常.但由于应用程序的要求,我将所有图像保存到文档目录,并在其可用时显示.
我已尝试使用@autoreleasepool并发布一些变量但未获得成功.
我很感激,如果有人有解决方案来管理内存管理.
**ARC is off in my application.**
其他一些评论:
>使用ObjectAlloc工具在instruments中运行您的应用程序,并且应该立即明确哪些对象未被释放.如果您不了解乐器,那么现在是时候学习它了.
>你可以’跟踪’对象并在使用ObjectTracker解除分配时收到消息 – 但是它是为ARC设计的,所以你可能需要调整它.如果您使用它,您将在每个对象被释放时看到一条消息
>当表格视图使用单元格完成时,您可以接收一个委托方法,告诉您,然后您可以将单元格保留为nil(释放)和对象
>你对downloadQueue的使用是奇怪的 – 在你的实例中创建一次作为ivar,根据需要使用它,并在dealloc发布它
>您隐藏主队列上的活动微调器,但不要在主队列上启动它
>您命令活动视图从超级视图中删除自己,但随后在子视图中查找并尝试将其删除:
[self.activityView removeFromSuperview];
for (UIView * view in self.subviews) { if([view isKindOfClass:[UIActivityInDicatorView class]]) [view removeFromSuperview]; }
以上是大佬教程为你收集整理的ios – 当我在滚动UITableview期间显示文档目录中的图像时,内存不断增加然后应用程序崩溃全部内容,希望文章能够帮你解决ios – 当我在滚动UITableview期间显示文档目录中的图像时,内存不断增加然后应用程序崩溃所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。