【发布时间】:2021-07-09 12:19:27
【问题描述】:
我有一个结构 Rectangle :
struct Rectangle {
var width: Float
var length: Float
}
还有一个全局方法:
func add(p1: UnsafeMutablePointer<Float>, p2: UnsafeMutablePointer<Float>) -> Float {
return p1.pointee + p2.pointee
}
当rectangle 实例在堆栈中时,调用方法add 是安全的。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var rectangle = Rectangle(width: 1.0, length: 2.0)
let perimeter = add(p1: &rectangle.width, p2: &rectangle.length) * 2
}
}
但是当rectangle实例在堆中时,调用方法add会崩溃。
class ViewController: UIViewController {
var rectangle = Rectangle(width: 1.0, length: 2.0)
override func viewDidLoad() {
super.viewDidLoad()
let perimeter = add(p1: &rectangle.width, p2: &rectangle.length) * 2
}
}
崩溃信息如下:
Thread 1: Simultaneous accesses to 0x1038090d0, but modification requires exclusive access
【问题讨论】:
-
据我所知,Swift 无法保证变量的位置。您不能确定属性是在堆中,还是局部变量在堆栈中。