以下代码有效但编译器强迫我在dispatch_sync
内使用self,我相信IMO self
尚未创建且无法访问。为什么自我在静态函数内?
我试图用这种方式代替
dispatch_sync(queue, {
if (object == nil) {
object = SingleObject()
}
})
return object!
工作版
import Foundation
public class SingleObject {
public struct Static {
private static var object: SingleObject?
public static func getObject() -> SingleObject {
let queue = dispatch_queue_create("queue", nil)
dispatch_sync(queue, {
if (self.object == nil) {
self.object = SingleObject()
}
})
return object!
}
}
}
SingleObject.Static.getObject()
答案 0 :(得分:0)
问题不在于dispatch_async
,而是因为您在闭包中引用self
。
每当在闭包中使用self
时,它就会被捕获为强引用。这可能会导致强大的引用周期 - 为了防止错误地捕获self
,swift要求在访问属性和方法时显式使用self
。
请注意,self
是在静态上下文中定义的,它指的是类型而不是实例。因此,在静态方法中使用self
可以访问在同一个类/结构中定义的所有静态属性和方法。
有关详情,请参阅Automatic Reference Counting