在教程中,它们都被描述为功能上相同的,即使闭包比块更容易,它也避免了块和内存管理的复杂性。我已经看过很多教程,但除了这些内容,我还没有理解 Swift 的“闭包”和 Objective-C 的“块”之间的区别。
摘自:苹果公司“使用Swift与Cocoa和Objective-C。”iBooks:
“Swift闭包和Objective-C块是兼容的,因此您可以将Swift闭包传递给期望块的Objective-C方法。 Swift闭包和函数具有相同的类型,因此甚至可以传递Swift函数的名称。
闭包具有类似于块的捕获语义,但在一个关键方面不同:变量是可变的而不是被复制的。 换句话说,在Swift中,变量的默认行为是Objective-C中__block的行为。”
略有不同之处。其中一个被提到过;变量被作为变量而不是值来捕获。这既可以是有用的,也可能是陷阱。重要的是,在 Swift 闭包中可以定义一个捕获列表,如果在捕获列表中包含 self.property,则该属性的值会被捕获,而不是 self。这也简化了捕获弱变量的过程。
let x : @convention(swift) (inout Int) -> ()
let y : @convention(block) (inout Int) -> ()
出现错误:(inout Int) -> ()
在Objective-C中无法表示。
UnsafePointer<Int>
。这使得这两个签名是一样的。 - Brandonobjc_msgSend
调用,在运行时动态地将参数推送到堆栈上。如果您不知道更好的方法,请保持安静。 - Brandon