我尝试在
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)") }