使用高内存的 Swift 进程

Posted

技术标签:

【中文标题】使用高内存的 Swift 进程【英文标题】:Swift process using high memory 【发布时间】:2020-04-21 19:03:40 【问题描述】:

我正在尝试在容器视图中创建和布局图像。 当我将此代码添加到我的视图控制器时,我收到内存不足警告并且必须强制退出 Xcode。

  private let sw: CGFloat = UIScreen.main.bounds.width
  private let sh: CGFloat = UIScreen.main.bounds.height

  private let iw: CGFloat = 340.0
  private let ih: CGFloat = 400.0

  private lazy var widthS: CGFloat =  (0.7 * sw) - (2 * 20.0) ()
  private lazy var heightS: CGFloat =  (widthS * ih) / iw ()

  private let maxHeightL: CGFloat = 450.0
  private lazy var heightL: CGFloat =  min(maxHeightL, sh * 0.5) ()
  private lazy var widthL: CGFloat =  (heightL * iw) / ih ()

我有一个设置函数,我可以在其中设置此图像并使用约束对其进行布局。

private func setupIV() 
    img = getImageFromDB()
    iv = UIImageView(image: img)
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.contentMode = .scaleAspectFit

    ivContainer.addSubview(iv)

    let height: CGFloat = deviceType == .phone ? heightS : heightL

let topMargin: CGFloat = (UIDevice.current.screenType == .i5) ? 0.0
  : (UIDevice.current.screenType == .i6) ? 20.0
  : (UIDevice.current.screenType == .i6P) ? 30.0
  : (UIDevice.current.screenType == .ix) ? 50.0
  : (UIDevice.current.screenType == .iXR) ? 60.0
  : (UIDevice.current.screenType == .iXSMax) ? 80.0
  : (UIDevice.current.screenType == .p129) ? 40.0
  : 0.0

    iv.topAnchor.constraint(equalTo: iContainer.topAnchor, constant: topMargin).isActive = true
    iv.bottomAnchor.constraint(equalTo: iContainer.bottomAnchor, constant: -topMargin).isActive = true
    iv.centerXAnchor.constraint(equalTo: iContainer.centerXAnchor).isActive = true
    iv.centerYAnchor.constraint(equalTo: iContainer.centerYAnchor).isActive = true
    iv.heightAnchor.constraint(equalToConstant: height).isActive = true
  

当我检查我的活动监视器时,swift 正在消耗 90GB 内存。

我使用的是 xcode v 版本 11.3.1 (11C504)

这可能与这里的计算有关吗? 谢谢

【问题讨论】:

【参考方案1】:

问题在于我使用的多个三元条件运算符。当我使用 switch 代替嵌套的三元条件运算符时,内存不足的问题就解决了。

我将我的图像视图布局的 topMargin 设置从这里转为:

let topMargin: CGFloat = (UIDevice.current.screenType == .i5) ? 0.0
  : (UIDevice.current.screenType == .i6) ? 20.0
  : (UIDevice.current.screenType == .i6P) ? 30.0
  : (UIDevice.current.screenType == .ix) ? 50.0
  : (UIDevice.current.screenType == .iXR) ? 60.0
  : (UIDevice.current.screenType == .iXSMax) ? 80.0
  : (UIDevice.current.screenType == .p129) ? 40.0
  : 0.0

到这里:

switch UIDevice.current.screenType 
case .i5:
  topPadding = 0.0
case .i6:
  topPadding = 20.0
case .i6P:
  topPadding = 30.0
case .ix:
  topPadding = 50.0
case .iXR:
  topPadding = 60.0
case .iXSMax:
  topPadding = 80.0
case .p129:
  topPadding = 40.0
default:
  topPadding = 0.0

swift、SourceKitService 或 XCBBuildService 的内存使用量现在约为 600 MB 或小于 1 GB(而不是在使用嵌套三元条件的情况下为 90 GB)。

【讨论】:

以上是关于使用高内存的 Swift 进程的主要内容,如果未能解决你的问题,请参考以下文章

win10进程System内存占用过高怎么解决

java进程占用系统内存高,排查解决

服务器内存占用过高如何解决?

MySQL占用内存过高怎么办

win10进程System内存占用过高怎么解决

aix 查看占用内存高的进程