检查Objective-C中对象的大小

我试图find一个Objective-C对象的大小。 我正在使用类似于:

NSLog(@"sizeof myObject: %ld", sizeof(*myObject)); 

这只是给了我指针的大小。

我究竟做错了什么?

所有编译器知道的是指针,这就是为什么你得到指针的大小。 要查看分配的对象的大小,请使用以下代码片段之一:

用ARC:

 #import <malloc/malloc.h> // ... NSLog(@"Size of %@: %zd", NSStringFromClass([myObject class]), malloc_size((__bridge const void *) myObject)); 

没有ARC:

 #import <malloc/malloc.h> // ... NSLog(@"size of myObject: %zd", malloc_size(myObject)); 

Mike Ash在他的Q&A博客上有一些关于Obj-C运行时内部的体面的文章: http ://mikeash.com/?page=pyblog/friday-qa-2009-03-13-intro-to-the -objective-C-runtime.html

在GNU Objective-C运行时中,您可以使用(您必须导入<objc/objc-api.h>

 class_get_instance_size ([MyClass class]); 

在Mac OS X上,您可以使用(您可能需要导入<objc/runtime.h> ):

 class_getInstanceSize ([MyClass class]); 

这些函数将返回分配一个对象需要多less内存,它将不包括对象在初始化时分配的内存。

首先,我想从上面的post中可以清楚的看出, 对象大小是由Jason提出的malloc_size(myObject)给出的,也是在Mac OS参考手册中给出的:

“malloc_size( ptr )函数返回的是由ptr指向的分配内存块的大小,内存块的大小至less与其返回的分配一样大,可能会更大。 ( http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/malloc_size.3.html

但是,如果您有兴趣查找字典的大小,请记住以下几点:

字典存储键值对,并且在值部分中包含对象本身,而只是增加了要“添加”的对象的保留计数,并保持该对象与其自身的引用。 现在,字典本身只包含对各种对象的引用(附有一个键)。 所以,如果有机会,你正在寻找字典所指的所有对象的对象大小,技术上不会是字典的大小。 字典的大小将是所有键的大小加上所有键的大小加上父级NSObject的大小的总和。 如果您仍然有兴趣查找引用对象的大小,请尝试迭代字典值数组:

 NSArray *myArray = [myDictionary allValues]; id obj = nil; int totalSize = 0; for(obj in myArray) { totalSize += malloc_size(obj); } //totalSize now contains the total object size of the refered objects in the dictionary. 

希望能回答这个问题。

(objective-c)对象的大小不容易find,因为它不易定义。 你的意思是“客观C对象的大小”?

引用的大小是指针的大小(由sizeof(obj_ref)返回)。

在创build(+ alloc)上分配的内存大小可以通过Jason在第一个答案中给出的方式find。 但这取决于运行时间。 gnu运行时不同于苹果运行时。 最终,这只是实例组成的原始数据types所需的内存。 但不是可能以后分配的内存(即在初始化(-init)期间)由ivars或string引用的对象。

类的一个实例

 @interface FirstClass { int _someInt; char _someChar; } … @end 

需要至less5个字节(在许多系统上 – int大小可能会有所不同)加上运行时需要的静态开销。 这样的对象的大小是显而易见的。

但是对于这个类的一个例子

 @interface SecondClass { FirstClass *_someObject; char *_name; id _data; } … @end 

“规模”的定义并不复杂。 该对象需要12个字节(在32位系统上)加上分配的开销。 但也许这个名字是对象的一部分,并被分配/释放。 实际名称需要的内存是否应该是对象大小的一部分? 那么被引用的对象呢?

我会build议使用class_getInstanceSizemalloc_good_size来看看它会取决于什么。 这不会显示返回大小内的ivars和什么。

 #import <malloc/malloc.h> #import <objc/runtime.h> NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class]))); 

我认为类描述包含大小信息 – 查询这个比查询使用sizeof运算符更好。