2012-08-06 78 views
1

我在滚动自己的对象高速缓存。它基本上是一个NSMutableSet。如何查找iOS/Cocoa中集合对象的内存占用情况

有没有办法找出(编程)收集了多少内存目前正在使用,这样我就能触发不太重要对象的一些清洗?

+2

只是好奇,你不是仅仅使用'NSCache'? – omz 2012-08-06 11:39:43

+0

我问自己这个问题后,我想起了它,现在我只是好奇。 – horseshoe7 2012-08-06 11:44:11

+0

大小不应该是从缓存中清除对象的唯一启发式。一个大而且用得很多的对象应该留在缓存中。 – 2012-08-06 12:18:38

回答

4

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

根据需要对内存警告你可以清除数据。

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

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

+0

最后我猜NSCache是​​要走的路吗?关于它的实现,而不是NSMutableSet或其他什么,我只需要支持NSPurgeableContent协议并将NSCache与NSMutableDictionary类似处理? – horseshoe7 2012-08-06 11:45:55

+0

是的,基本上就是这样。另外请确保,如果你想利用成本,设置对象和成本。 – Jesper 2012-08-06 11:48:59

+0

对于一个对象的“成本”我有点不清楚。这是将它当作“优先/重要性”对待的一种方式,还是它是对象的大小的一般衡量标准?成本在确定是否被驱逐时起什么作用? – horseshoe7 2012-08-06 11:52:11

0

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

sizeof(object); 

malloc_size(object); 
+1

除了它总是会返回32位或64位(取决于架构)的任何对象,因为它们都只是指针。 – omz 2012-08-06 11:46:19

+0

它返回字符串的结果与具有5 MB数据的NSData对象的结果相同,所以它可能比普遍有用的更方便。 – Jesper 2012-08-06 11:46:21

1

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

通过检查对象的序列化大小,可以更好地近似内存大小,但集合中的对象需要符合NSCoding才能使用。您可以制定一个NSCoder的实施方案,计算传递给它的用于序列化的数据的总大小,而不是“真实”地序列化数据。将此编码器传递给您的集合的encodeWithCoder:方法,然后收集集合中所有对象的总大小。

相关问题