我正在尝试查找objective-c对象的大小。我正在使用类似的东西:
NSLog(@"sizeof myObject: %ld", sizeof(*myObject));
这只是给了我指针的大小。
我做错了什么?
答案 0 :(得分:51)
所有编译器都知道指针,这就是为什么你得到指针的大小。要查看已分配对象的大小,请使用以下代码段之一:
#import <malloc/malloc.h>
// ...
NSLog(@"Size of %@: %zd", NSStringFromClass([myObject class]), malloc_size((__bridge const void *) myObject));
#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_getInstanceSize
和malloc_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
运算符进行查询。