【问题标题】:Subclass of NSObject - Its weight in terms of bytes [duplicate]NSObject 的子类 - 以字节为单位的权重 [重复]
【发布时间】:2014-02-10 02:26:02
【问题描述】:

我有以下 NSObject 子类。如何以字节为单位找到它的“权重”?我知道指向这个对象的指针是 16 个字节(我从How much memory is reserved when initializing NSObject? 得到了那个信息)

@interface PersonRecord : NSObject

@property(nonatomic,strong) NSString *personName;
@property(nonatomic,strong) NSArray *personPhoneNumbers;
@property(nonatomic,strong) NSArray *personPhoneNumberTypes;
@property(nonatomic,strong) NSArray *personAddresses;
@property(nonatomic,strong) NSArray *personAddressTypes;
@property(nonatomic,strong) NSArray *personEmailIDs;
@property(nonatomic,strong) NSArray *personEmailIDTypes;
@property(nonatomic,strong) NSData *personImageData;

@end

例如,NSString 占用 1 个字节,NSArray 占用 'n' 个字节等。有确定的计算方法吗?

我的目标是找出如果我从 NSArray 内的 iPhone 地址簿中收集 500 个这些,它会不会占用 iPhone 的太多 RAM。

【问题讨论】:

  • 这些都是指针,因此在 64 位机器上每个占用 8 个字节。我不知道对象的“开销”——16 个字节听起来很轻——我也不知道可以对大小应用什么舍入。
  • 当然,这些指针指向的对象也会占用空间。

标签: ios objective-c memory-management


【解决方案1】:

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

我们可以使用 Objective-C 运行时中名为 class_getInstanceSize 的便捷方法来验证这一点,它会告诉我们一个类的单个分配会有多“大”:

NSLog(@"%lu", class_getInstanceSize([PersonRecord class]));

正如预期的那样,这在 64 位系统上记录“72”,在 32 位系统上记录“36”。

不过,Hot Licks 指出这只是纯PersonRecord 的大小是对的。它不包括任何属性指向的数据大小。如果您尝试将数百 GB 的数据加载到一个字符串中并将其放入该 PersonRecordpersonName 字段中,您可能只有一个 PersonRecord,但仍然会耗尽内存。

在您开始优化此对象定义以尝试从其中挤出每个最后一个字节之前,您应该始终先测量您的应用,并且仅当且仅当您已测量并有证明 em> 有问题。

但是...使用粗略计算,其中 500 个对象只有 36,000 个字节,如果我们估计这 500 个对象中的每一个都可能指向另外 1,000 个字节的数据,那么我们就是查看 536,000 字节:不到半兆字节的分配。你可能不会有这个问题。但再说一遍:测量测量测量。

【讨论】:

  • 你的信封计算是我需要听到的。你让我想起了我的 Algorithms-101 教授,他曾经说过完全相同的话! :-D
  • 即使每个对象都指向 10,000 字节的数据,那么我们仍然只查看大约 5 兆字节的数据。这仍然(可能)不足以破坏记忆库:)
  • 我怀疑 getInstanceSize 没有报告堆帧的开销。至少需要有一个大小和一个引用计数。但这些可能被视为对象本身的“外部”。
  • @HotLicks 是的,这些超出了适当的分配范围。引用计数可以存储在许多不同的地方(有时压缩到 isa 或全局查找表中),所以这些都不会计入这个大小:)
  • 我想,事实上,我指出 getInstanceSize 会严重低估像 NSMutableArray 这样的东西,其中使用的存储的主要部分是在单独分配的指针数组中。
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 2014-06-09
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多