我有以下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的太多内存。
答案 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字节:不到半兆字节的分配。你可能不会有这个问题。但是又一次:测量测量。