报亭内存存储问题,如何获取应用缓存目录?

Posted

技术标签:

【中文标题】报亭内存存储问题,如何获取应用缓存目录?【英文标题】:newsstand memory storage issue, how do i get the app cache directory? 【发布时间】:2014-04-22 16:11:08 【问题描述】:

我有一个报亭应用程序,其中包含杂志并使用报亭框架。我意识到删除杂志和/或下载杂志时出了点问题,因为当我访问设置/使用时,我的应用程序在下载和删除同一杂志时内存使用量不断增长。 发现问题...在委托方法中下载问题时:

-(void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL

我只需要在最后添加类似这样的内容:

NSError *error;
[[NSFileManager defaultManager] removeItemAtPath:[destinationURL path] error:&error];
if (error)
    NSLog(@"ERROR:%@", error);

即使目录被称为“缓存”,您也需要手动删除。好的问题解决了,但是那些已经下载了我的应用程序并且在缓存目录中有大量 MB 的客户呢?

我想知道如何获取此目录并在启动时删除其中的所有内容,并且只删除一次... 我只能使用NSUserdefault 执行一次,但是如何获取此目录并删除其中的任何 zip 文件...此目录和其中的文件的示例是:

/private/var/mobile/Applications/1291CC20-C55F-48F6-86B6-B0909F887C58/Library/Caches/bgdl-280-6e4e063c922d1f58.zip

但此路径因设备而异。我想在发布时执行此操作,因此我确定没有正在进行的下载,但欢迎任何其他解决方案,提前致谢。

【问题讨论】:

【参考方案1】:

您需要做的就是枚举 Caches 目录中的所有文件并删除具有 zip 扩展名的文件:

- (void)removeZipFilesFromCachesDirectory 
    static NSString *const kZIPExtension = @"zip";

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *cachesDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSError *error = nil;
    NSArray *fileNames = [fileManager contentsOfDirectoryAtPath:cachesDirectoryPath error:&error];
    if (error == nil) 
        for (NSString *fileName in fileNames) 
            NSString *filePath = [cachesDirectoryPath stringByAppendingPathComponent:fileName];
            if ([filePath.pathExtension.lowercaseString isEqualToString:kZIPExtension]) 
                NSError *anError = nil;
                [fileManager removeItemAtPath:filePath error:&anError];
                if (anError != nil) 
                    NSLog(@"%@", anError);
                
            
        
     else 
        NSLog(@"%@", error);
    

【讨论】:

似乎很有希望。在我对其进行测试后,如果它有效,您将获得奖励;) 谢谢兄弟,完美无瑕。我会尽快奖励赏金。但是我仍然有 100 MB 的使用量(设置/使用/myapp),并且我在调试时检查了缓存目录中的文件大小都小于 1MB。任何想法可能是什么?核心数据可能(我保存图像的 NSData)?但在全新安装中,使用量约为 40 MB(在 sqlite 中使用相同的数据) @user2387149 你能在模拟器中运行应用程序吗?在这种情况下,您可以看到所有与应用程序相关的目录及其内容。此外,某些数据可能存储在 Documents 目录中,而不仅仅是 Caches。 我想到了,但由于这个错误,我无法在模拟器中运行它:ld: symbol(s) not found for architecture i386 "_OBJC_CLASS_$_CATiledLayer",引用自:objc- TiledPDFView.o 中的类引用:/ @user2387149 似乎您使用的 lib 不是为 i386(模拟器)架构编译的。尝试在 google 中找到 i386 的这个库。

以上是关于报亭内存存储问题,如何获取应用缓存目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取ceph的缓存池中对象的大小和偏移?

什么是内存缓存,它是如何工作的?

基于堆外内存存储提升Spark内存资源使用效率

缓存专题

Java如何获取Redis中存储的大量内容?

文档目录在objective c中存储数据或缓存好?