Swift – 泛型问题导致内存泄漏
发布时间:2020-12-14 05:24:42 所属栏目:百科 来源:网络整理
导读:我尝试在 swift ios应用程序中实现CQRS模式,我发现了奇怪的行为. 核心课程: class QueryT {} class QueryHandlerTResult,TQuery:QueryTResult { func execute(query: TQuery,callback: (result: TResult) - Void ) { }} 实施课程: class GetRandomStringsQ
我尝试在
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)") } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |