iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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.**

解决方法

UIImagePNGRepresentation可能会返回非自动释放的对象 – 您可以尝试释放它并查看是否会导致崩溃.显然你没有发布一些东西,但除了图像表示之外别无其他.

其他一些评论

>使用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,请注明来意。