Swift 4 - 获取数组的内存大小

4

我需要找出我刚刚下载的一个Swift 4 AnyObject数组的大小。每个移动设备都有一些自由内存(大小因用户而异),我需要一种方法来检查我的下载大小。我已经搜索过了,但没找到一个合理的答案。希望你能帮忙!

1个回答

0

目前似乎不可能。但如果你只需要一个粗略的估计,你可以使用class_getInstanceSize

func size<T: AnyObject>(_ array: [T]) -> Int {
    return class_getInstanceSize(T.self) * array.count
}

对于这个示例数组

class Test {

    var a: Bool = false
    var b: Int = 0
    var c: String = ""

}

let array = [Test(), Test(), Test()]

您将获得大小为168。有关更多信息,请参见此篇文章

当然,这种方法对于变长字段(例如字符串或数组)不起作用。我所看到的唯一可能性是为每个可能的类编写一个函数以计算所需的确切字节数。例如,对于字符串,您可以使用以下公式计算字节数:

"test".data(using: .utf8)!.count

但即使使用这种方法,您也无法获得Swift用于存储数组的内部真实大小。

所以问题是:为什么需要知道数组的大小?而您不知道下载数据的大小的原因是什么?如果这些数据来自外部,它们必须已经编码为字节表示,所以计数应该很容易。


很高兴回复您的问题。我使用Firestore,每当用户读取或写入数据时都会产生费用(我预计会有成千上万的用户)。这些费用会累积起来,因此我想要降低成本,而且每个人的手机也不同。 - user3783935
很高兴回答我的意图。我使用Firestore,每次用户读取或写入时都会花费我的金钱(我预计会有成千上万的用户)。这些费用会累积,我想削减成本,而且每个人的手机都不同,有些人的内存比其他人多。如果我想下载10,000个或更多的项目,我需要知道我可以使用多少内存。理想情况下,我希望只需下载一次,然后从内部存储器中读取。所有这些都必须是动态的,我正在为有限的内存制定B计划,还有很多要说的,但这就是要点。 - user3783935

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接