当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Objective-C中检查对象的大小》经验,为你挑选了5个好方法。

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

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

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

我究竟做错了什么?



1> Jason Coco..:

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

使用ARC:

#import 

// ...

NSLog(@"Size of %@: %zd", NSStringFromClass([myObject class]), malloc_size((__bridge const void *) myObject));

没有ARC:

#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


如果您正在使用ARC,请改用此代码(不要忘记导入malloc.h!):`NSLog(@"大小为%@:%zd",NSStringFromClass([myObject class]),malloc_size(( __bridge const void*)myObject));`
应该注意的是,大多数类还将它们的状态存储在它们通过指针引用的对象中.这些将与类分开分配(例如,NSString是一个包含isa指针的结构,一个指向通过malloc分配的缓冲区的指针,以及一些其他数据)

2> dreamlax..:

在GNU Objective-C运行时,您可以使用(必须导入:

class_get_instance_size ([MyClass class]);

在Mac OS X上,您可以使用(您可能需要导入):

class_getInstanceSize ([MyClass class]);

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



3> Ameer Sheikh..:

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

希望能回答这个问题.



4> Tilo Prütz..:

(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位系统上)以及分配开销.但也许名称是对象的一部分,并由它分配/释放.实际名称需要的内存应该是对象大小的一部分吗?那引用的对象呢?



5> 小智..:

我建议使用class_getInstanceSizemalloc_good_size查看它的含义。这不会在返回的大小内显示空值和其他内容。

#import 
#import 

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

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有