在Objective-C中检查对象的大小

时间:2009-04-17 19:58:57

标签: c objective-c sizeof

我正在尝试查找objective-c对象的大小。我正在使用类似的东西:

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

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

我做错了什么?

6 个答案:

答案 0 :(得分:51)

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

使用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&amp; A博客上对一些Obj-C运行时内部结构进行了大量的撰写:http://mikeash.com/?page=pyblog/friday-qa-2009-03-13-intro-to-the-objective-c-runtime.html

答案 1 :(得分:19)

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

class_get_instance_size ([MyClass class]);

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

class_getInstanceSize ([MyClass class]);

这些函数将返回分配对象所需的内存量,它不包括初始化时对象分配的内存。

答案 2 :(得分:13)

首先,我认为从上面的帖子可以清楚地看出对象大小是由malloc_size(myObject)给出的,正如Jason和Mac OS参考手册中所建议的那样:

“malloc_size( ptr )函数返回内存块的大小,该内存块支持由       PTR 。内存块大小始终至少与它支持的分配一样大,并且可能更大。“(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.

希望回答这个问题。

答案 3 :(得分:7)

(objective-c)对象的大小不容易找到,因为它甚至不容易定义。你对“物镜c物体的大小”有什么意思?

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

创建时分配的内存大小(+ alloc)可以通过Jason在第一个答案中给出的方式找到。但这取决于运行时。 gnu-runtime与apple-runtime不同。最终,这只是实例所包含的原始数据类型所需的内存。但是可以稍后(即在初始化期间(-init))为ivars或字符串引用的对象分配的内存。

班级的实例

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

需要至少5个字节(在许多系统上 - int大小可能不同)加上运行时需要它的静态开销。这种物体的大小是显而易见的。

但对于班级的实例

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

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

答案 4 :(得分:4)

我建议您使用class_getInstanceSizemalloc_good_size来查看它将会是什么。这不会显示返回大小内的ivars和whatnot。

#import <malloc/malloc.h>
#import <objc/runtime.h>

NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));

答案 5 :(得分:-2)

我认为类描述包含大小信息 - 最好查看它,而不是使用sizeof运算符进行查询。