gpt4 book ai didi

ios - Swift Struct 与 Class : what is the allowed stack size? 并将类重构为结构

转载 作者:IT王子 更新时间:2023-10-29 05:14:42 25 4
gpt4 key购买 nike

首先,我理解值类型和引用类型之间的区别——这不是那个问题。我正在用 Swift 重写我的一些代码,并决定也重构一些类。因此,我想我会看看某些类作为结构是否有意义。

内存:我有一些模型类包含非常大的数组,它们的大小不断增长(未知最终大小),并且可能存在数小时。首先,是否有任何关于结构的建议大小或绝对大小的指南,因为它存在于堆栈中?

重构用途:因为我现在正在重构的东西是一团糟,依赖太多,所以我想知道如何改进它。 View 和 View Controller 大多很容易,这是我的模型,它的作用总是让我希望有更好的例子可以遵循。

WorkerManager:一次拥有一个或两个 Worker 的单例。一个将始终记录来自传感器的新数据,另一个将查看存储的数据。 View Controller 从 WorkerManager 获取 Worker 引用,并向 Worker 请求要显示的数据。

Worker:在队列中执行所有操作,以防止内存访问问题(C 数组指针随着它们的增长而不断变化)。 监听:监听的Worker监听新数据,将它发送到一个Processor对象(它创建的)清理数据并存储它在 Worker 持有的 C 数组中。然后,如果有有效数据,Worker 告诉 Analyzer(也由 worker 所有)分析数据并将其存储在其他 C 数组中以提供给 View . ProcessorAnalyzer 都需要状态来知道过去发生了什么,接下来要处理和分析什么。纯原始数据存储在单独的 Record NSManaged 对象中。 审阅者 获取记录并使用纯原始数据重新创建所有分析数据,以便对其进行审阅。 (分析数据量大,不想存盘)

现在,我的第二个问题是,是否可以/应该将 ProcessorAnalyzer 替换为结构?或者 Worker 的协议(protocol)?它们并不是通常意义上的真正“对象”,只是一组方便的相关方法和必要的状态。而且由于每个代码都有将近一千行,我不想将它们全部放在一个类中,甚至不想放在同一个文件中。

我只是不太清楚如何删除我的所有状态,如何对数组上执行的所有复杂数学运算使用纯函数,以及将它们放在哪里。

最佳答案

虽然结构本身存在于堆栈中,但数组数据存在于堆中,因此数组的大小可以动态增长。因此,即使您有一个包含数百万个项目的数组并将其传递到某个地方,在您更改新数组之前也不会复制任何项目,因为 copy-on-write执行。这在 2015 WWDC Session 414 中有详细描述。 .

关于第二个问题,我认为2015 WWDC Session 414又有答案了。 Apple engineers recommend 的基本检查值类型是:

Use a value type when:

  • Comparing instance data with == makes sense
  • You want copies to have independent state
  • The data will be used in code across multiple threads

Use a reference type (e.g. use a class) when:

  • Comparing instance identity with === makes sense
  • You want to create shared, mutable state

根据您的描述,我认为引用类型更适合 ProcessorAnalyzer。如果您尚未创建新的 ProducerAnalyzer<,那么 ProcessorAnalyzer 的副本似乎不是有效对象s 明确。您不想共享对这些对象的更改吗?

关于ios - Swift Struct 与 Class : what is the allowed stack size? 并将类重构为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447010/

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