1

我正在滚动我自己的对象缓存。它基本上是一个 NSMutableSet。

有没有办法(以编程方式)找出集合当前正在使用多少内存,以便我可以触发一些不太重要的对象的清除?

4

3 回答 3

4

定义“集合”。您用来维护集合的结构的大小?对象指针的大小?对象持有的实例变量的大小?

您可以根据需要在内存警告中清除数据。

找出对象的实例变量使用多少内存的 Objective-C 运行时方法是class_getInstanceSize,尽管我认为这不是正确的方法。一个拥有一个 NSData 和 5 MB 数据的对象的时钟将低于一个拥有两个 NSString 的对象。

因为我不知道你为什么要滚动自己的缓存,所以这就是我要做的。我会定义一种方法来计算出与我保留的物品成比例的成本。(对于图像,假设宽度 * 高度。)然后我会使用NSCache它支持为每个对象提供成本,保持最大成本并自动清除。

于 2012-08-06T11:42:18.527 回答
1

据我所知,没有内置任何东西可以解决这个问题。、和不提供可靠的方法class_getInstanceSize,因为它们会给你一个空对象甚至一个对象指针的大小。这意味着如果您采用这些方法中的任何一种,十个字符的字符串的大小和一百个字符的字符串的大小将是相同的。sizeofmalloc_size

您可以通过检查对象的序列化大小来更好地估计对象的内存大小,但是您的集合中的对象需要符合才能NSCoding使其工作。您可以实现NSCoder计算已传递给它以进行序列化的数据的总大小,而无需“真正”序列化数据。将此编码器传递给您的集合的encodeWithCoder:方法,然后收集集合中所有对象的总大小。

于 2012-08-06T11:58:07.483 回答
0

sizeof() 是一个方便的工具。

sizeof(object);

或者

malloc_size(object);
于 2012-08-06T11:45:04.333 回答