gpt4 book ai didi

Swift - 泛型问题导致内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-30 21:59:31 24 4
gpt4 key购买 nike

我尝试在 swift ios 应用程序中实现 CQRS 模式,但我发现了奇怪的行为。

核心类(class):

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 检测内存泄漏。

我们的行为是,当我们从 GetRandomStringsQueryHandler 中删除父类(super class)并从执行函数中删除“override”修饰符时,将不会发生内存泄漏,应用程序将正常运行!

有人可以解释这种行为吗?是我的错误还是 swift 的问题?

我在 swift 2 中使用 Xcode 的最终版本。

最佳答案

有趣的问题!我将您的代码粘贴到 Playground 上,并设法重现了您遇到的错误。我试图调整代码,但未能使泛型起作用。作为替代方案,我最终使用协议(protocol)来重写代码来表达约束。

核心协议(protocol):

protocol QueryType {
typealias ResultType
}

protocol QueryHandler {
typealias Query: QueryType
func execute(query: Self.Query, callback: (result: Self.Query.ResultType) -> Void)
}

符合类:

class GetRandomStringsQuery: QueryType {
typealias ResultType = [String]

internal var prefix:String

init(prefix: String) {
self.prefix = prefix
}
}


class GetRandomStringsQueryHandler: QueryHandler {

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)
}

}

调用代码:

let query = GetRandomStringsQuery(prefix: "leak leak leak :(")

let queryHandler = GetRandomStringsQueryHandler()

queryHandler.execute(query) { (result) -> Void in
print("total records: \(result.count)")
}

关于Swift - 泛型问题导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32650618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com