我在滚动自己的对象高速缓存。它基本上是一个NSMutableSet。如何查找iOS/Cocoa中集合对象的内存占用情况
有没有办法找出(编程)收集了多少内存目前正在使用,这样我就能触发不太重要对象的一些清洗?
我在滚动自己的对象高速缓存。它基本上是一个NSMutableSet。如何查找iOS/Cocoa中集合对象的内存占用情况
有没有办法找出(编程)收集了多少内存目前正在使用,这样我就能触发不太重要对象的一些清洗?
定义“集合”。您用于维护集合的结构的大小?对象指针的大小?对象拥有的实例变量的大小?
根据需要对内存警告你可以清除数据。
找出对象的实例变量使用多少内存的Objective-C运行时方法是class_getInstanceSize
,尽管我不认为这是正确的方法。一个拥有5MB数据的单个NSData的对象的时钟频率低于具有两个NSStrings的对象。
因为我不知道为什么你滚你自己的缓存,这里就是我会做。我会定义一种方法来计算我保留的项目的比例成本。 (对于图像,我们假设宽度*高度。)然后,我会使用NSCache
,它支持为每个对象提供成本,从而保持最高成本并自动清除。
最后我猜NSCache是要走的路吗?关于它的实现,而不是NSMutableSet或其他什么,我只需要支持NSPurgeableContent协议并将NSCache与NSMutableDictionary类似处理? – horseshoe7 2012-08-06 11:45:55
是的,基本上就是这样。另外请确保,如果你想利用成本,设置对象和成本。 – Jesper 2012-08-06 11:48:59
对于一个对象的“成本”我有点不清楚。这是将它当作“优先/重要性”对待的一种方式,还是它是对象的大小的一般衡量标准?成本在确定是否被驱逐时起什么作用? – horseshoe7 2012-08-06 11:52:11
据我所知,没有什么内置的解决这个问题。 class_getInstanceSize
,sizeof
和malloc_size
不提供可靠的方法,因为它们会给你一个空对象或甚至一个对象指针的大小。这意味着如果采取这些方法中的任何一种方法,十个字符的字符串的大小和一百个字符的字符串的大小将会相同。
通过检查对象的序列化大小,可以更好地近似内存大小,但集合中的对象需要符合NSCoding
才能使用。您可以制定一个NSCoder
的实施方案,计算传递给它的用于序列化的数据的总大小,而不是“真实”地序列化数据。将此编码器传递给您的集合的encodeWithCoder:
方法,然后收集集合中所有对象的总大小。
只是好奇,你不是仅仅使用'NSCache'? – omz 2012-08-06 11:39:43
我问自己这个问题后,我想起了它,现在我只是好奇。 – horseshoe7 2012-08-06 11:44:11
大小不应该是从缓存中清除对象的唯一启发式。一个大而且用得很多的对象应该留在缓存中。 – 2012-08-06 12:18:38