Swift使用闭包

时间:2015-07-24 11:47:51

标签: swift memory closures

我只想在没有内存泄漏的情况下使用swift闭包内的函数参数,所以我只想确认我是否会以下列方式存在任何与内存相关的问题?请让我知道

func someMethod(someValue: String) {
    weak var weakSelf = self
    var copyOfSomeValue: String? = someValue.copy() as? String
    self.someOtherMethodWithCompletion(completionHandler: { () -> Void in
        if let strongSelf = weakSelf, let originalValue = copyOfSomeValue {
            strongSelf.updateMyViewWithText(originalValue)
        }
    })
}

2 个答案:

答案 0 :(得分:1)

使用swift,您应该使用[unowned self]并正常使用swift,例如:

func someMethod(someValue: String) {
    var copyOfSomeValue: String? = someValue.copy() as? String
    self.someOtherMethodWithCompletion(completionHandler: { () ->
        [unowned self]
         in
        if let originalValue = copyOfSomeValue {
            self.updateMyViewWithText(originalValue)
        }
    })
}

你应该对可能导致参考周期的变量使用弱或无主。它们之间的区别是:

  

只要对该引用有效,就使用弱引用   在其一生中的某个时刻没有。相反,使用无主   当你知道引用永远不会为零时引用   已在初始化期间设置

答案 1 :(得分:1)

Stringvalue type。尽管通过引用将capture闭包,但除非您在捕获后要更改someValue,否则无需复制。即便如此,您最好还是使用捕获列表[someValue],这些列表也会在您需要声明[weak self]时使用。

使用weakunowned是情境化的,请阅读here

func someMethod(someValue: String) {
    someOtherMethodWithCompletion { [weak self] in
        self?.updateMyViewWithText(someValue)
    }
}