Swift Struct vs Class:允许的堆栈大小是多少?并将类重构为结构

时间:2016-02-17 02:54:07

标签: ios arrays swift struct refactoring

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

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

重构使用:由于我现在正在重构过多依赖的混乱,我想知道如何改进它。视图和视图控制器很容易,它是我的模型,它的功能,这总是让我希望有更好的例子可供使用。

WorkerManager:一次只能拥有一个或两个Worker的单身人士。一个将始终从传感器记录新数据,另一个将审查存储的数据。视图控制器从Worker获取WorkerManager引用,并要求Worker显示数据。

Worker:队列中的所有内容,以防止内存访问问题(C数组指针随着它们的增长而不断变化)。 倾听:侦听Worker侦听新数据,将其发送到Processor对象(它创建的),清除数据并将其存储在由C持有的C数组中。 Worker。然后,如果存在有效数据,则Worker告诉Analyzer(也由工作者拥有)分析数据并将其存储在其他C数组中以供给视图。 ProcessorAnalyzer都需要知道过去发生了什么以及接下来要处理和分析的内容。纯原始数据存储在单独的Record NSManaged对象中。 审核人采用Record并使用纯原始数据重新创建所有已分析的数据,以便对其进行审核。 (分析数据很大,我不想将其存储到磁盘上)

现在,我的第二个问题是,是否/ ProcessorAnalyzer可以替换为结构?或者Worker的协议?它们不是正常意义上的“对象”,只是方便的相关方法组和必要的状态。而且因为每个代码几乎是一千行,我不想把它全部放在一个类,甚至是同一个文件中。

我对如何删除所有状态没有很好的理解,对阵列上执行的所有复杂数学运算使用纯函数,以及放置它们的位置。

1 个答案:

答案 0 :(得分:3)

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

关于第二个问题,我认为2015 WWDC Session 414再次得到答案。 Apple engineers recommend对值类型的基本检查是:

  

在以下情况下使用值类型:

     
      
  • 比较实例数据与==有意义
  •   
  • 您希望副本具有独立状态
  •   
  • 数据将用于跨多个线程的代码
  •   
     

在以下情况下使用引用类型(例如使用类)

     
      
  • 比较实例标识与===有意义
  •   
  • 您想创建共享的可变状态
  •   

因此,根据您所描述的内容,我认为引用类型更适合ProcessorAnalyzer。如果您未明确创建新的ProcessorAnalyzer,则ProducerAnalyzer的副本似乎不是有效对象。您不希望共享对这些对象的更改吗?