2015-11-06 37 views
2

我加載的UIImage從IOS文件目錄的數組:刪除文件contentsOfFile加載後

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()」命令時,我加載它們但並沒有區別。

我已經證實,刪除高於因爲如果我註釋掉該行應用程序的偉大工程,沒有錯誤的問題。從磁盤中刪除文件後,我只會遇到訪問陣列的錯誤。

有沒有辦法切斷這種聯繫?

編輯:

var images = [UIImage]() 
for fileName in fileNames { 
    let imgData = NSFileManager.defaultManager().contentsAtPath("\(imagesPath)/\(fileName).png")! 
    images.append(UIImage(data: imgData)!) 
} 

這樣做不會保留鏈接回到磁盤上的文件:%來自@Wain正確的答案,如果我將其更改爲代碼工作正常。尚未顯示

+1

你可以只保存圖像文件,在應用程序的/ tmp文件夾,讓iOS的把它清理乾淨你 – Paulw11

回答

3

的圖像,使數據還沒有完全被加載呢,只夠知道圖像細節和尺寸已經被加載。這是爲了提高內存效率。取決於圖像格式和使用情況,數據的不同部分可以在多個不同的時間加載。

如果您將文件加載到NSData,確保它不是內存映射,並從中創建映像,那麼數據和映像應與基礎文件解除鏈接。這樣做的內存效率較低,並且在知道完成所有圖像時最好保留當前代碼並刪除文件。

+0

所以,簡單地加載到一個NSDate變量,然後從創建的UIImage會解決這個問題? –

+1

我期待如此,雖然我還沒有嘗試過 – Wain

+0

剛剛測試過這個,你是對的! –