如何在iOS中查找任何对象的大小

Aje*_*rya 19 iphone cocoa-touch objective-c ios4

我正在优化我的应用程序并想知道对象的大小是多少,所以我也可以在日志中显示它.

假设我有

NSDictionary *temp=(NSDictionary*)[Data objectAtIndex:i];

//data is defined in the .h file 
Run Code Online (Sandbox Code Playgroud)

现在我怎么知道对象temp的大小是多少.

我尝试使用变量视图,在temp部分中我发现了instance_size =(long int)30498656

instance_size是我临时对象的确切大小吗?

我也试过了

sizeof(temp);
Run Code Online (Sandbox Code Playgroud)

但它在那一点上崩溃了.任何帮助......

Leg*_*las 30

编译器只知道指针,这就是它总是返回指针大小的原因.要找到分配对象的大小,请尝试类似的方法

NSLog(@"size of Object: %zd", malloc_size(myObject));
Run Code Online (Sandbox Code Playgroud)

  • 你忘了告诉你先添加#import <malloc/malloc.h>.在iOS 5中,如果不添加标题,它会给你警告.但是感谢那里的工作.在日志中还有更多的东西,它显示我的临时对象的大小为48,所以它是Mb或KB或字节.. :: P (20认同)
  • 您需要添加(__bridge const void*)以将自定义Object类型转换为(void*).__bridge用于在不更改对象所有者的情况下进行投射. (2认同)

Par*_*fna 11

首先,我认为从上面的帖子可以清楚地看出,对象大小是malloc_size(myObject)由Legolas和Mac OS参考手册中提供的:

malloc_size(ptr)函数返回支持ptr指向的分配的内存块的大小.内存块大小始终至少与它支持的分配一样大,并且可能更大.

但是如果你有兴趣找出字典的大小,请记住以下几点:

字典存储键值对,并且不在值部分中包含对象本身,而只是增加要"添加"的对象的保留计数,并保持该对象与其自身的引用.现在,字典本身只包含对各种对象的引用(附带一个键).因此,如果您正在寻找字典所引用的所有对象的对象大小,从技术上讲,这将不是字典的大小.字典的大小将是所有键的大小加上所有键引用的大小加上父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.
Run Code Online (Sandbox Code Playgroud)

参考


小智 5

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

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

NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));
Run Code Online (Sandbox Code Playgroud)