编译器在使用dispatch_sync时强制函数的静态方法内部自我

时间:2014-12-30 23:02:26

标签: swift

以下代码有效但编译器强迫我在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()

1 个答案:

答案 0 :(得分:0)

问题不在于dispatch_async,而是因为您在闭包中引用self

每当在闭包中使用self时,它就会被捕获为强引用。这可能会导致强大的引用周期 - 为了防止错误地捕获self,swift要求在访问属性和方法时显式使用self

请注意,self是在静态上下文中定义的,它指的是类型而不是实例。因此,在静态方法中使用self可以访问在同一个类/结构中定义的所有静态属性和方法。

有关详情,请参阅Automatic Reference Counting