Swift 中的“[self] in”和“[weak self] in”有什么区别?
What is difference between "[self] in" & "[weak self] in" in Swift?
我刚刚发现我可以在闭包中写“[self]”而不是[weak self]但是我不确定它是否安全。
更多详情:
之前:
func roundShape(corners: CACornerMask, radius: CGFloat) {
DispatchQueue.main.async { [weak self] in
layer.cornerRadius = radius
layer.maskedCorners = corners
}
}
现在:
func roundShape(corners: CACornerMask, radius: CGFloat) {
DispatchQueue.main.async { [self] in
layer.cornerRadius = radius
layer.maskedCorners = corners
}
}
所以知道区别的请点亮我
写入 [self]
与离开闭包相同,因为这意味着它可能导致与 [weak self]
不同的保留周期,顺便说一句,不需要任何 DispatchQueue.main.async {
作为 GCD 队列'持有对 self
的强烈引用
Weak self是ARC的一个概念,主要用来避免retain cycle。如果直接使用self,那么它会创建一个强引用,并且不会从内存中移除。因此,持有变量的对象将保持活动状态并导致内存泄漏。为了克服这个问题,必须使用 weak self,它会在工作完成后立即释放内存。
注意: 弱自我是一个可选所以你可以使用可选链接来访问变量。
我刚刚发现我可以在闭包中写“[self]”而不是[weak self]但是我不确定它是否安全。
更多详情:
之前:
func roundShape(corners: CACornerMask, radius: CGFloat) {
DispatchQueue.main.async { [weak self] in
layer.cornerRadius = radius
layer.maskedCorners = corners
}
}
现在:
func roundShape(corners: CACornerMask, radius: CGFloat) {
DispatchQueue.main.async { [self] in
layer.cornerRadius = radius
layer.maskedCorners = corners
}
}
所以知道区别的请点亮我
写入 [self]
与离开闭包相同,因为这意味着它可能导致与 [weak self]
不同的保留周期,顺便说一句,不需要任何 DispatchQueue.main.async {
作为 GCD 队列'持有对 self
Weak self是ARC的一个概念,主要用来避免retain cycle。如果直接使用self,那么它会创建一个强引用,并且不会从内存中移除。因此,持有变量的对象将保持活动状态并导致内存泄漏。为了克服这个问题,必须使用 weak self,它会在工作完成后立即释放内存。
注意: 弱自我是一个可选所以你可以使用可选链接来访问变量。