Objective-C中类的内存大小

我有兴趣知道内存的大小,分配一些Objective-C对象。

例如 :

[NSString stringWithString:@"2"]大于[NSNumber numberWithInt:2]

多大的是[NSNumber numberWithInt:2]int num=2

苹果有关于这个问题的一些文档吗? 我认为这个信息对于内存优化非常重要。

根据我的知识,没有准确的文档。 NSString和(IIRC)NSNumber被实现为类集群 ,即当你要求一个新的对象时,实际上你可能会得到一些未公开的子类的对象。

这也意味着当程序运行在不同的操作系统版本上时,事情可能会改变而不会发出警告,所以不要依赖确切的数字。

现在,我们来尝试一下粗略的估计。 当前所有Apple平台上的整数是4个字节。 指针在iOS上是4个字节。

对象分配在堆上; 在最低级别,堆分配由malloc完成。 我将假定iOS的malloc实现是从Mac OS上使用的实现派生而来 – 请查看这里的一些细节: http : //cocoawithlove.com/2010/05/look-at-how-malloc-works-on-mac.html

最重要的一点是,小对象的分配量是16个字节,即小对象将占用16个字节的倍数。

每个Objective-C对象都包含一个指向其类的指针。

所以,对于一个包含一个int的NSNumber,我估计你的指针是4个字节,加上对象的16个字节(包括一个4字节的类指针和 – 我猜 – 四字节的int,再加上8个字节的空间)。

对于一个NSString,对于不同的情况有不同的具体子类。 string文字@"2"将指向一个静态分配的string文字对象,在运行时创build的string可能会有不同的表示forms。 一般来说,我猜想4个字节(您的指针)+ 16个字节(NSString对象)+字符数* 2(sizeof(unichar))四舍五入到16的倍数。

总而言之,我估计 NSNumbers需要比int s多五倍的内存。 我进一步估计,与NSString相同的数字比int更多地占用10倍的内存。

另请注意,分配Objective-C对象比定义types为int的局部variables要慢很多 。 但是,你也应该记住,这往往不重要, 过早的优化是万恶之源

没有NSStringNSNumber这样的事情,它们的逻辑实际上是在多个不同的类中实现的,每个类都有或多或less的内存占用。 所以它不可能在运行前说一个类的权重(然而你可以问ObjC运行时这个问题)。 这就是说,另一件事是[NSNumber numberWithInt:2]将最有可能返回一个NSNumber的单例实例(afair每个整数高达12caching),所以你不真的添加东西到你的内存足迹。

除了这一切,去优化你的记忆是错误的方式! 如果一个对象比另一个重64字节,那又如何? 即使在iPhone上,64字节也不算什么! 你会最终在更大的内存问题,你可以实际优化,例如。 通过懒加载你的东西或任何。 但是在使用仪器进行testing时会发现这些问题,而在您编写代码时不会提前发现问题 (即使在testing运行之前,进行简单的“优化”也不会产生任何影响,甚至会对性能造成更坏的影响,您会感到惊讶!)

在NSNumber和NSString的情况下

 NSLog(@"size was %ld", class_getInstanceSize([NSNumber class])); NSLog(@"size was %ld", class_getInstanceSize([NSString class])); 

在我的Mac(其中有64位指针)给8和8。

文档在这里: http : //developer.apple.com/library/ios/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/uid/TP40001418-CH1g-SW38

看看仪器 。 这些工具应该能够回答你的问题。