gpt4 book ai didi

swift - 数组默认按值传递&线程安全

转载 作者:可可西里 更新时间:2023-11-01 02:02:22 29 4
gpt4 key购买 nike

假设我有一个类,它有一个 Array 对象 Photo:

class PhotoManager {
fileprivate var _photos: [Photo] = []

var photos: [Photo] {
return _photos
}
}

我读了one article上面写着:

By default in Swift class instances are passed by reference and structs passed by value. Swift’s built-in data types like Array and Dictionary, are implemented as structs.

意味着上面的 getter 返回一个 [Photo] 数组的副本。

然后,同一篇文章试图通过重构代码使 getter 线程安全:

fileprivate let concurrentPhotoQueue = DispatchQueue(label: "com.raywenderlich.GooglyPuff.photoQueue",
attributes: .concurrent)
fileprivate var _photos: [Photo] = []
var photos: [Photo] {
var photosCopy: [Photo]!
concurrentPhotoQueue.sync {
photosCopy = self._photos
}
return photosCopy
}

上面的代码明确地在getter中复制了self._photos

我的问题是:

  1. 如果默认情况下 swift 已经像文章一开始所说的那样返回一个副本(按值传递),为什么文章再次复制到 photosCopy 以使其线程安全?我觉得自己对那篇文章中提到的这两部分并不完全理解。

  2. Swift3 真的像文章所说的那样默认为 Array 实例按值传递吗?

有人可以为我澄清一下吗?谢谢!

最佳答案

我会反过来回答你的问题:

  1. Does Swift3 really pass by value by default for Array instance like the article says?

简单的回答:是的

但我猜这不是您在询问“Swift3 真的是否按值传递”时关心的问题。 Swift 的行为就好像数组被完整复制,但在幕后它优化了操作并且整个数组不会被复制,直到,如果,它需要被复制。 Swift 使用称为写时复制 (COW) 的优化。

然而,对于 Swift 程序员来说,如何复制完成并不像操作的语义那么重要 - 即在赋值/复制之后,两个数组是独立且变异的一个不会影响另一个。

  1. If by default swift already return an copy (pass by value) like the article said in the first place, why the article copy again to photosCopy to make it thread-safe? I feel myself do not fully understand these two parts mentioned in that article.

这段代码所做的是确保复制以线程安全的方式完成。

数组不是一个微不足道的值,它被实现为多字段结构,其中一些字段引用其他结构和/或对象 - 这是支持数组大小增长的能力等所必需的。

在多线程系统中,一个线程可能会尝试复制数组,而另一个线程正在尝试更改数组。如果允许这些同时发生,那么事情很容易出错,例如数组可能会在复制过程中发生变化,从而导致复制无效 - 部分旧值,部分新值。

Swift 本身 不是线程安全的;特别是它不会阻止在执行复制时更改数组。您拥有的代码通过使用 GCD 队列解决了这个问题,这样在一个线程对数组的任何更改期间,任何其他线程中对数组的所有其他写入或读取都将被阻止,直到更改完成。

您可能还担心它们是这里进行的多个副本,self._photosphotoCopy,然后 photoCopy 到返回值.虽然语义上这是实际发生的事情,但随着 Swift 系统的优化,可能只有一个复杂的副本(并且这将是线程安全的)。

HTH

关于swift - 数组默认按值传递&线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45437327/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com