我试图找到一个objective-c对象的大小。我正在使用类似于:
NSLog(@"sizeof myObject: %ld", sizeof(*myObject));
这只是给了我指针的大小。
我究竟做错了什么?
我试图找到一个objective-c对象的大小。我正在使用类似于:
NSLog(@"sizeof myObject: %ld", sizeof(*myObject));
这只是给了我指针的大小。
我究竟做错了什么?
编译器只知道指针,这就是为什么您要返回指针的大小。要查看分配对象的大小,请使用以下代码片段之一:
#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 在他的问答博客上写了一篇关于 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 上,您可以使用(您可能需要 import <objc/runtime.h>
):
class_getInstanceSize ([MyClass class]);
这些函数将返回分配对象需要多少内存,它不包括对象在初始化时分配的内存。
首先,我认为从上面的帖子中可以清楚地看出,对象大小由 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.
希望能回答这个问题。
(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 位系统上)加上分配开销。但也许名称是对象的一部分并由它分配/释放。实际名称所需的内存是否应该是对象大小的一部分?那么引用的对象呢?
我建议使用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
运算符查询要好。