我尝试在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的最终版本。
答案 0 :(得分:2)
有趣的问题!我将您的代码粘贴到游乐场并设法重现您遇到的错误。我试图调整代码,但未能使泛型工作。作为替代方案,我最终使用协议重写代码来表达约束。
核心协议:
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)")
}