检查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_getInstanceSize
和malloc_good_size
来看看它会取决于什么。 这不会显示返回大小内的ivars和什么。
#import <malloc/malloc.h> #import <objc/runtime.h> NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));
我认为类描述包含大小信息 – 查询这个比查询使用sizeof
运算符更好。