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

时间:2014-02-10 02:26:03

标签: ios objective-c memory-management

我有以下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的太多内存。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

然而,Hot Licks指出这只是纯PersonRecord的大小是正确的。它不包括任何属性指向的数据大小。如果您尝试将数百GB的数据加载到字符串中并将其放入PersonRecord的{​​{1}}字段,那么您可能只有一个PersonRecord但仍然内存不足。

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

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