这可能是一个基本问题,但只是想知道答案。当我们在 iOS Obj C 程序中创建每个变量(如 int、NSString、NSDictionary、NSData 等)时将占用多少内存。我希望,它会类似于基于数据类型的大小(或)不同的 C 程序?
谢谢!
这可能是一个基本问题,但只是想知道答案。当我们在 iOS Obj C 程序中创建每个变量(如 int、NSString、NSDictionary、NSData 等)时将占用多少内存。我希望,它会类似于基于数据类型的大小(或)不同的 C 程序?
谢谢!
简而言之,你不能。至少不是以有用的方式。
几乎每个类都会有任意数量的分配,这些分配不直接计入实例的分配。同样,许多类 -- NSDictionary
, NSArray
, NSString
-- 实际上是类簇的一部分,因此,实际分配的是子类。最后,对于各种集合和数据类,相关分配的大小将根据其内容而有很大差异。某些类—— UIImage
、NSData
等——可能包含实际上不是由堆分配表示的 MB 数据,因为它们正在映射来自文件系统的数据。
或者,总而言之,class_getInstanceSize()
是无用的。
相反,您需要关注应用程序的内存使用情况,将其作为其操作行为的系统特征。Allocations Instrument 可以很好地测量内存使用情况,更重要的是,它可以帮助您确定内存消耗的原因。
您应该将 Objective-C 对象的大小视为您不能依赖的实现细节。它们可能碰巧从一个环境到另一个环境是一致的,但它们不能保证这一点。此外,没有一致且完整的方法可以让您测量它们的大小,因为它们可能以各种巧妙的方式实现。
如果您需要精确管理内存分配,只需使用 C 类型,它们本身就是完全有效的 Objective-C。
Apple 开发者网站的以下文档将对您有所帮助。
您可以通过调用它来获取任何类的大小,例如:
#import "objc/runtime.h"
int size = class_getInstanceSize([NSDictionary class]);
这取决于您希望放入此类的内容(NSString、NSDictionary、NSData)。你可以说 NSMutableString 等改变了它们的大小,但它们只是重新分配自己。