gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:16:20 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





In Objective-C, how does +alloc know how much memory to allocate?

(4 个回答)


8年前关闭。




我有以下 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 个字节,因此我们可以预期您的 8 个属性(加上 NSObject 中定义的 isa 的一个)占用 72 个字节。在 32 位系统上,它会占一半。

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

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

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

但是,Hot Licks 正确地指出,这只是纯 PersonRecord 的大小。 .它不包括任何属性指向的数据大小。你只能有一个 PersonRecord如果您尝试将数百千兆字节加载到一个字符串中并将其放入该 PersonRecord 中,但仍然会耗尽内存。的 personName field 。

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

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

关于ios - NSObject 的子类 - 以字节为单位的权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21668107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com