在contentsOfFile加载后删除文件

时间:2015-11-06 23:34:12

标签: ios swift2

我正在从iOS Documents目录加载一个UIImage数组:

var images = [UIImage]()
for fileName in fileNames {
    images.append(UIImage(contentsOfFile: "\(imagesPath)/\(fileName).png")!)
}

我将继续使用这个数组,但我不再需要这些文件,所以我继续删除它们:

for fileName in fileNames {
    do {
        try NSFileManager.defaultManager().removeItemAtPath("\(imagesPath)/\(fileName).png")
    } catch {
        print("Error")
    }
}

当我这样做时,我的UIImage数组现在无效,并在尝试访问它时给我错误。这不应该在内存中,与磁盘上的文件无关吗?

我在加载图像时尝试对图像使用“.copy()”命令,但没有区别。

我已经确认删除是上面的问题,因为如果我注释掉该行,该应用效果很好,没有错误。从磁盘删除文件后,我只会收到访问数组的错误。

有没有办法切断此连接?

编辑:根据@Wain的正确答案,如果我将其更改为:

,代码可以正常工作
var images = [UIImage]()
for fileName in fileNames {
    let imgData = NSFileManager.defaultManager().contentsAtPath("\(imagesPath)/\(fileName).png")!
    images.append(UIImage(data: imgData)!)
}

执行此操作不会将链接保留回磁盘上的文件。

1 个答案:

答案 0 :(得分:3)

图像尚未显示,因此数据尚未完全加载,只足以知道图像细节和尺寸已加载。这是为了提高内存效率。根据图像格式和用法,可以在多个不同时间加载不同的数据部分。

如果您将文件加载到NSData,确保它没有内存映射,并从中创建图像,那么数据和图像应该从基础文件中取消链接。这样会降低内存效率,最好保留当前代码,并在知道完所有图像后删除文件。