Swift 2 (Xcode 7 beta 3) でアプリケーションを開発しており、可能な場合は値の型 (構造体と列挙型) を使用しようとしています。メモリ管理に関する Apple のドキュメントによると、値型を操作しても保持サイクルは発生せず、機能するはずです。
しかし、今日、イベント処理コードで大量のメモリ リークが発生しました。私はそれを追跡し、問題を次の最小限の例に減らしました。
Item
単一のプロパティを定義するプロトコルがあるとしましょうvalue
:
protocol Item {
var value: String { get }
}
Item
次に、プロトコルを実装し、追加のプロパティを追加する具体的な構造体を作成しますadditionalValue
。struct を呼び出しましょうFooItem
。
struct FooItem<T>: Item {
let value: String
let additionalValue: T
init(value: String, additionalValue: T) {
self.value = value
self.additionalValue = additionalValue
}
}
パズルの 3 番目のピースは、Item
プロトコルを実装するアイテムをラップする別の構造体です。と呼ばれていItemWrapper
ます。
struct ItemWrapper {
let item: Item
init(item: Item) {
self.item = item
}
}
ItemWrapper
メモリ リーク設定を使用して Instruments でプロファイリングすると、値が で作成されるたびにメモリ リークが発生しますFooItem
。
let item = FooItem(value: "protocol value", additionalValue: "foo item value")
let _ = ItemWrapper(item: item)
サンプルXcode プロジェクトとInstruments ファイルは次のとおりです: https://www.dropbox.com/s/z6ugxzxqggrv1xl/SwiftStructsMemoryLeak.zip?dl=0
コード例全体は、このGist で表示できます: https://gist.github.com/lukaskubanek/4e3f7657864103d79e3a
バグレポートは次のとおりです: rdar://21375421
それは Swift コンパイラのバグですか、それとも何か間違ったことをしていますか?
EDIT 1 : コメントで示唆されているように、Swift コミュニティや言語の開発者からより多くの注目を集めるために、この質問をApple Dev Forumに再投稿しました。WWDC 2015 中に開発フォーラムが移行されたため、新しいフォーラムに更新された質問を投稿する必要がありました。リンクは次のとおりです: https://forums.developer.apple.com/message/9643
編集 2 : サンプル コードで最初に投稿した問題は、Swift 2.0で解決されたようです。私のアプリの問題は解決しなかったので、サンプル コードに別の変更を加えました。FooItem
の追加のプロパティにはジェネリック型があり、FooItem
その型で注釈が付けられているため、ジェネリック型です。これは私が自分のアプリで使用している方法であり、それでもメモリリークが発生しますが、今回ItemWrapper
はプロパティにアクセスするときではなく、が初期化されるときです。
編集 3 : Swift 2.0 で持続する変更された問題に質問を完全に更新し、新しい Xcode プロジェクトの例をアップロードしました。