アップデート :
Core Data や CollectionView とは何の関係もありません。CollectionView を保持している ViewController を却下したことはありません。詳細は以下の回答で!
Swift iOS でメモリ リークが発生しています。最初はフェッチ関数にあると思っていましたが、別のことを試しました。私UICollectionViewCell
と私の関係はManaged Object
、いろいろなところで断ち切られました。画像を取得しています。そこで、フェッチの結果を、結果があった回数だけ配列に追加されたランダムな画像アセットに置き換えました。これは常に私のリークを修正しました。これで、フェッチ関数の問題ではなく、Cell に向かう途中の他の関数の問題ではないことがわかりました。
グーグルで調べたところ、Core Data はそれ自体で強力な参照サイクルを作成する傾向があることがわかりました。しかし、それだけではないと思います。もしそうなら、Cell で得られた画像の配列を使用しなくてもかまいません。まだリークがあるはずですが、画像を Core Data から Cell に接続しなければ、リークはありません。
私が理解していないのは、そもそもなぜリークがあるのかということです。配列は参照ではなく値のように機能すると思いました。したがって、コアデータからロードされた画像を配列に配置すると、コピーのように機能し、強力な参照サイクルがあってはなりません...
また、画像の Binary Data 属性を持つ管理対象オブジェクトを更新しても問題が解決しないこともわかりました。
それで、私は今何をしますか?すべてのセルを削除する必要がありますか? Core Data の NSData から UIImages を作成する必要がありますか? オブジェクトの属性を更新する方法を見つける必要がありますか? ...
ありがとう!
フェッチ(物事を として設定しようとしましたがweak
、機能しません):
import UIKit
import CoreData
func getFilteredThumbImages (albumIdentifier: String, moc : NSManagedObjectContext?) -> [NSData]? {
var error: NSError?
let resultPredicate = NSPredicate(format: "iD = %@", albumIdentifier)
let albumfetchRequest = NSFetchRequest(entityName: "Album")
albumfetchRequest.predicate = resultPredicate
var results = moc!.executeFetchRequest(albumfetchRequest, error:&error)!
if error == nil {
weak var tempFThumbs = results.last!.mutableSetValueForKey("filteredThumbs")
weak var testFoundImages = tempFThumbs!.mutableSetValueForKey("imageData")
var foundImages = testFoundImages!.allObjects as [NSData]
moc!.refreshObject(results.last! as NSManagedObject, mergeChanges: false)
moc!.reset()
return foundImages
}
else {
moc!.refreshObject(results.last! as NSManagedObject, mergeChanges: false)
//appDel?.managedObjectContext?.reset()
moc!.reset()
return nil
}
}
UICollectionViewCell :
import UIKit
class CollectionViewCell: UICollectionViewCell {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
let textLabel: UILabel!
let imageView: UIImageView!
override init(frame: CGRect) {
NSLog("MyObject init")
super.init(frame: frame)
imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
imageView.backgroundColor = UIColor(red:1, green:0.992, blue:0.965, alpha:1)
imageView.contentMode = UIViewContentMode.ScaleAspectFit
imageView.clipsToBounds = true
contentView.backgroundColor = UIColor(red:1, green:0.992, blue:0.965, alpha:1)
contentView.addSubview(imageView)
}
}
セル内の入力画像 (thumbs は変数配列 => [NSData]):
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
println("loading...")
weak var cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as? CollectionViewCell
//cell!.imageView?.image = UIImage(named: "test")
if thumbs != nil {
cell!.imageView?.image = UIImage(data: thumbs![indexPath.row])
println("loading \(thumbs!.count) cells")
}
return cell!
}