35

我试图找到一个objective-c对象的大小。我正在使用类似于:

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

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

我究竟做错了什么?

4

6 回答 6

55

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

使用 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 在他的问答博客上写了一篇关于 Obj-C 运行时内部的文​​章:http ://mikeash.com/?page=pyblog/friday-qa-2009-03-13-intro-to-the -objective-c-runtime.html

于 2009-04-17T20:17:56.803 回答
19

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

class_get_instance_size ([MyClass class]);

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

class_getInstanceSize ([MyClass class]);

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

于 2009-04-18T05:45:29.060 回答
15

首先,我认为从上面的帖子中可以清楚地看出,对象大小由 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.

希望能回答这个问题。

于 2010-09-16T20:00:48.457 回答
7

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

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

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

类的一个实例

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

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

但是对于类的一个实例

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

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

于 2009-04-17T21:58:01.680 回答
5

我建议使用class_getInstanceSizemalloc_good_size查看它的结果。这不会显示返回大小内的 ivars 和其他内容。

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

NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));
于 2013-01-28T18:00:21.330 回答
-2

我认为类描述包含大小信息——查找它比使用sizeof运算符查询要好。

于 2009-04-17T20:17:43.373 回答