弱引用self和弱引用self()的区别

7

[weak self]作为闭包参数传递和将[weak self]()作为闭包参数传递有什么区别?

例如:

dispatch_async(dispatch_get_main_queue()) { [weak self] in 
     //Some code here
}

v/s

dispatch_async(dispatch_get_main_queue()) { [weak self] () -> Void in
     //Some code here
}

@MartinR 更新了代码。实际上,在一些实现中,我看到 [weak self] 被使用而没有圆括号,而在一些实现中,它被用作 weak self。这两者之间的区别是什么? - Samkit Jain
1个回答

9

当你使用闭包时,不要将[weak self]()作为参数传递。

  • [weak self]是一个捕获列表,位于
  • 参数列表/返回类型声明的前面,如:() -> Void

如果上下文中可以推断出返回类型或者参数列表和返回类型,则可以省略返回类型或两者。因此,以下所有内容都是有效且完全等效的:

dispatch_async(dispatch_get_main_queue()) { [weak self] () -> Void in 
    self?.doSomething()
}

dispatch_async(dispatch_get_main_queue()) { [weak self] () in 
    self?.doSomething()
}

dispatch_async(dispatch_get_main_queue()) { [weak self] in 
    self?.doSomething()
}

该闭包接受空参数列表 (),并返回 Void 类型。

()= Void。为了清晰起见,您应该更喜欢Void而不是(), 因此这应该是Void -> Void。 - Yariv Nissim
@yar1vn:这可能是个人口味的问题。我更喜欢使用()表示空/无参数列表,以及使用Void作为返回类型。这也是苹果在dispatch_block_t定义中所做的。 - Martin R
  1. dispatch_block_t 不是 Swift 函数。
  2. Swift 社区正在创建标准,它更喜欢 Void。
  3. 但你说得对,因为它们都可以工作,所以你可以选择任何一个你喜欢的。
- Yariv Nissim
“()->Void”是Swift编译器导入dispatch_block_t的C定义的方式。-您有关于#2的参考资料吗? - Martin R
查了一下,显然你是对的。社区更喜欢 ()->Void。来自Erica Sadun的博客。 - Yariv Nissim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接