Swift 进程使用高端内存
Swift process using high memory
我正在尝试在容器视图中创建和布局图像。
当我将此代码添加到我的视图控制器时,我收到内存不足警告并且必须强制退出 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
}
当我检查我的 Activity 监视器时,swift 占用了 90GB 内存。
我正在使用 xcode v 版本 11.3.1 (11C504)
会不会跟这里的计算有关?
谢谢
问题是我使用的多个三元条件运算符。当我使用 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)。
我正在尝试在容器视图中创建和布局图像。 当我将此代码添加到我的视图控制器时,我收到内存不足警告并且必须强制退出 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
}
当我检查我的 Activity 监视器时,swift 占用了 90GB 内存。
我正在使用 xcode v 版本 11.3.1 (11C504)
会不会跟这里的计算有关? 谢谢
问题是我使用的多个三元条件运算符。当我使用 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)。