我试图找到一个objective-c对象的大小.我正在使用类似的东西:
NSLog(@"sizeof myObject: %ld", sizeof(*myObject));
这只是给了我指针的大小.
我究竟做错了什么?
所有编译器都知道是指针,这就是为什么你得到指针的大小.要查看已分配对象的大小,请使用以下代码段之一:
#import// ... NSLog(@"Size of %@: %zd", NSStringFromClass([myObject class]), malloc_size((__bridge const void *) myObject));
#import// ... 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运行时,您可以使用(必须导入
:
class_get_instance_size ([MyClass class]);
在Mac OS X上,您可以使用(您可能需要导入
):
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)对象的大小不容易找到,因为它甚至不容易定义.你对"物镜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位系统上)以及分配开销.但也许名称是对象的一部分,并由它分配/释放.实际名称需要的内存应该是对象大小的一部分吗?那引用的对象呢?
我建议使用class_getInstanceSize
和malloc_good_size
查看它的含义。这不会在返回的大小内显示空值和其他内容。
#import#import NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));