私はswift iosアプリケーションでCQRSパターンを実装しようとしましたが、私は奇妙な動作を見つけました。スウィフト - ジェネリックスの問題原因メモリリーク
コアクラス:
class Query<T> {}
class QueryHandler<TResult, TQuery:Query<TResult>> {
func execute(query: TQuery, callback: (result: TResult) -> Void) {
}
}
の実装クラスの一覧:
class GetRandomStringsQuery: Query<[String]> {
internal var prefix:String
init(prefix: String) {
self.prefix = prefix
}
}
class GetRandomStringsQueryHandler: QueryHandler<[String], GetRandomStringsQuery> {
override func execute(query: GetRandomStringsQuery, callback: (result: [String]) -> Void) {
var result = [String]()
for var i = 0; i < 100; i++ {
result.append("[\(i)]: \(query.prefix)")
}
callback(result: result)
}
}
使用例:コールバックで
@IBAction func generateMemoryLeak(sender: AnyObject) {
let query = GetRandomStringsQuery(prefix: "leak leak leak :(")
let queryHandler = GetRandomStringsQueryHandler()
queryHandler.execute(query) { (result) -> Void in
print("total records: \(result.count)")
}
}
我々は、アレイ内の100個の要素を取得する必要があります。実行時に参照が失われ、値が不明であるようです。 iOS Developer Instrumentsはメモリリークを検出します。
Weid behavaiorは、GetRandomStringsQueryHandlerからスーパークラスを削除し、実行関数から "override"修飾子を削除するとメモリリークが発生せず、アプリケーションがうまく動作します。
誰かがこの動作について説明できますか?それは私の間違いか迅速な問題ですか?
私は迅速2.
どのようにメモリリークがあると決定されていますか?メモリが不足してクラッシュしている実際のデバイスで実行していますか?または楽器で確認するだけですか?楽器で確認したら、実際のデバイスやシミュレータを使用していますか?そしてどちらの方法でも、どのような記憶が漏れていると報告されていますか? – nhgrif
今すぐアプリケーションを実行すると例外が発生します:libswiftCore.dylib'_swift_release_(swift :: HeapObject *)のEXC_BAD_ACCESS: デバイスとの接続でシミュレータを使用しています。 – razor118
これはメモリリークとはちょっと違うので、おそらくあなたの質問に追加する必要があります。 – nhgrif