4

这可能是一个基本问题,但只是想知道答案。当我们在 iOS Obj C 程序中创建每个变量(如 int、NSString、NSDictionary、NSData 等)时​​将占用多少内存。我希望,它会类似于基于数据类型的大小(或)不同的 C 程序?

谢谢!

4

5 回答 5

3

简而言之,你不能。至少不是以有用的方式。

几乎每个类都会有任意数量的分配,这些分配不直接计入实例的分配。同样,许多类 -- NSDictionary, NSArray, NSString-- 实际上是类簇的一部分,因此,实际分配的是子类。最后,对于各种集合和数据类,相关分配的大小将根据其内容而有很大差异。某些类—— UIImageNSData等——可能包含实际上不是由堆分配表示的 MB 数据,因为它们正在映射来自文件系统的数据。

或者,总而言之,class_getInstanceSize()是无用的。

相反,您需要关注应用程序的内存使用情况,将其作为其操作行为的系统特征。Allocations Instrument 可以很好地测量内存使用情况,更重要的是,它可以帮助您确定内存消耗的原因。

于 2013-07-25T20:22:05.217 回答
2

您应该将 Objective-C 对象的大小视为您不能依赖的实现细节。它们可能碰巧从一个环境到另一个环境是一致的,但它们不能保证这一点。此外,没有一致且完整的方法可以让您测量它们的大小,因为它们可能以各种巧妙的方式实现。

如果您需要精确管理内存分配,只需使用 C 类型,它们本身就是完全有效的 Objective-C。

于 2013-07-25T20:35:18.333 回答
1

Apple 开发者网站的以下文档将对您有所帮助。

http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/MemoryManagementforYouriOSApp/MemoryManagementforYouriOSApp.html

于 2013-07-25T18:42:32.517 回答
1

您可以通过调用它来获取任何类的大小,例如:

#import "objc/runtime.h"
int size = class_getInstanceSize([NSDictionary class]);
于 2013-07-25T18:36:52.127 回答
1

这取决于您希望放入此类的内容(NSString、NSDictionary、NSData)。你可以说 NSMutableString 等改变了它们的大小,但它们只是重新分配自己。

于 2013-07-25T18:37:01.710 回答