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

前端之家收集整理的这篇文章主要介绍了Swift – 泛型问题导致内存泄漏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试在 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 behvaior是当我们从GetRandomStringsQueryHandler中删除超类并从执行函数删除“覆盖”修饰符时,将没有内存泄漏,应用程序将正常工作!

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

我用swift 2使用Xcode的最终版本.

有趣的问题!我将您的代码粘贴到游乐场并设法重现您遇到的错误.我试图调整代码,但未能使泛型工作.作为替代方案,我最终使用协议重写代码来表达约束.

核心协议:

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相关文章