Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSObject的子类-以字节为单位的权重_Ios_Objective C_Memory Management - Fatal编程技术网

Ios NSObject的子类-以字节为单位的权重

Ios NSObject的子类-以字节为单位的权重,ios,objective-c,memory-management,Ios,Objective C,Memory Management,我有以下NSObject子类。我如何找到以字节为单位的“权重”?我知道这个对象的指针是16字节(我从 例如,NSString需要1个字节,NSArray需要'n'个字节等等。是否有一种确定的计算方法 我的目标是,如果我从NSArray内的iPhone通讯簿中收集500个指针,它会不会消耗太多的iPhone内存。在64位系统上,指针每个都是8字节,因此我们可以预期您的8个属性(加上一个用于NSObject中定义的isa)将占用72字节。在32位系统上,它将占用其中的一半 我们可以在Objectiv

我有以下NSObject子类。我如何找到以字节为单位的“权重”?我知道这个对象的指针是16字节(我从

例如,NSString需要1个字节,NSArray需要'n'个字节等等。是否有一种确定的计算方法


我的目标是,如果我从NSArray内的iPhone通讯簿中收集500个指针,它会不会消耗太多的iPhone内存。

在64位系统上,指针每个都是8字节,因此我们可以预期您的8个属性(加上一个用于
NSObject
中定义的isa)将占用72字节。在32位系统上,它将占用其中的一半

我们可以在Objective-C运行时中使用一个名为的简便方法来验证这一点,该方法将告诉我们一个类的单个分配有多大:

NSLog(@"%lu", class_getInstanceSize([PersonRecord class]));
正如所料,在64位系统上记录“72”,在32位系统上记录“36”

然而,hotlicks正确地指出,这只是纯
PersonRecord
的大小。它不包括任何属性指向的数据大小。如果您试图将数百GB的字节加载到一个字符串中,并将其放入
PersonRecord
personName
字段中,则可能只有一个
PersonRecord
,但内存仍然不足

在您优化此对象定义以尝试压缩其中的每一个字节之前,您应该始终首先测量应用程序,并且仅当且仅当您已经测量并有证据证明存在问题时才进行优化


但是。。。使用信封背面的计算,其中500个只有36000字节,如果我们估计这500个对象中的每一个可能指向另外1000字节的数据,那么我们将看到536000字节:不到半兆的分配。你可能不会有什么问题。但同样:度量。

在64位系统上,每个指针都有8个字节,因此我们可以预期您的8个属性(加上在
NSObject
中定义的isa的一个属性)将占用72个字节。在32位系统上,它将占用其中的一半

我们可以在Objective-C运行时中使用一个名为的简便方法来验证这一点,该方法将告诉我们一个类的单个分配有多大:

NSLog(@"%lu", class_getInstanceSize([PersonRecord class]));
正如所料,在64位系统上记录“72”,在32位系统上记录“36”

然而,hotlicks正确地指出,这只是纯
PersonRecord
的大小。它不包括任何属性指向的数据大小。如果您试图将数百GB的字节加载到一个字符串中,并将其放入
PersonRecord
personName
字段中,则可能只有一个
PersonRecord
,但内存仍然不足

在您优化此对象定义以尝试压缩其中的每一个字节之前,您应该始终首先测量应用程序,并且仅当且仅当您已经测量并有证据证明存在问题时才进行优化


但是。。。使用信封背面的计算,其中500个只有36000字节,如果我们估计这500个对象中的每一个可能指向另外1000字节的数据,那么我们将看到536000字节:不到半兆的分配。你可能不会有什么问题。但是,请再说一遍:度量。

这些都是指针,因此在64位机器上每个指针占用8个字节。我不知道对象的“开销”——16字节听起来很轻——也不知道大小可以采用什么舍入。当然,这些指针指向的对象也会占用空间。这些都是指针,因此在64位机器上每个指针占用8字节。我不知道的是一个对象的“开销”——16字节听起来很轻——我也不知道可以对大小进行什么舍入。当然,这些指针指向的对象也会占用空间。我需要听的是你的信封背面计算。你让我想起了我的算法——101教授,他曾经说过完全相同的话-如果每个对象指向10000字节的数据,那么我们仍然只看到大约5兆字节的数据。这仍然(可能)不足以破坏内存库:)我怀疑getInstanceSize没有报告堆帧的开销。至少需要有一个大小和引用计数。但这些可能被视为“超出”对象本身。@HotLicks是的,这些超出了分配本身的范围。引用计数可以存储在多个不同的位置(有时压缩到isa或全局查找表中),因此这两个值都不会计入此大小:)我猜,事实上,我要指出的是,getInstanceSize将严重低估NSMutableArray之类的东西,其中使用的存储的主要部分是在单独分配的指针数组中。我需要听到的是您的后台计算。你让我想起了我的算法——101教授,他曾经说过完全相同的话-如果每个对象指向10000字节的数据,那么我们仍然只看到大约5兆字节的数据。这仍然(可能)不足以破坏内存库:)我怀疑getInstanceSize没有报告堆帧的开销。至少需要有一个大小和引用计数。但这些可能被视为“超出”对象本身。@HotLicks是的,这些超出了分配本身的范围。引用计数可以存储在多个不同的位置(有时压缩到isa或全局查找表中),因此这两个值都不会计入此大小:)我猜,事实上,我要指出的是,getInstanceSize将严重低估NSMutableArray之类的内容,其中使用的存储的主要部分位于单独分配的poin中