我知道我应该在闭包中使用self来访问实例变量,如果我不使用,Xcode会显示错误,但当我在reduce方法的闭包中省略self时,我没有得到错误。在那种情况下我能省略self吗?
案例A
gridsCount = (0..<collectionView!.numberOfSections()).reduce(0) { [weak self] (sum, section) -> Int in
return sum + self.gridsInSection(section)
}
情况B
gridsCount = (0..<collectionView!.numberOfSections()).reduce(0) { (sum, section) -> Int in
return sum + gridsInSection(section)
}
在块中可以省略self
的原因在于函数声明中存在@noescape
关键字:
@warn_unused_result @rethrows func reduce<T>(initial: T, @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> T
来自Xcode 6发行说明:
新的@noescape属性可以用于函数的闭包参数。这表示该参数只被调用过(或在调用中作为
@noescape
参数传递(,这意味着它不能超过调用的生存期。这启用了一些次要的性能优化,但更重要的是禁用了闭包参数中的
self.
要求。
@noescape
防止self
被保留,这对于使用闭包以同步方式运行它是完全可以的,因为您确信self
在执行过程中是活动的。
如果您的闭包将被用作某种异步操作的完成块,如网络请求、从库中检索媒体文件等。如果您非常需要保留self
并在块内保持活动,则不使用@noescape
标记它。