我是Objective C的新手(具有C ++背景)。我想知道在这里使用arrayWithCapacity实际留下了多少内存。我还没有告诉它我将在阵列中添加什么类型的对象。
例如,如果我要存储200个NSString,每个200个字符,它们在内存中是连续的吗?如果是这样,存储200个bool值会浪费大量内存吗?
我希望你能看到我的目标。我确信在使用Objective C之后我会找到答案,但这与我正在进行的项目有关。所以,如果有人能解释,我将不胜感激。谢谢!
答案 0 :(得分:5)
NSArray
并不在您的示例中存储字符串本身。它存储指向字符串的指针。 arrayWithCapacity
分配至少足够的存储空间来存储这200个指针。但这并不意味着200 * sizeof(指针)。 NSArray
不承诺连续存储。它可以以任何方式存储它的指针,它可以改变它的想法,并在运行时重新组织它自己喜欢。所以它分配足够的东西,以至于在添加200个对象之前它不需要增长。"
如果您想浏览基础数据结构的当前详细信息(可能会有变化),请参阅CFArray source code。如果您想就NSArray
表现的主题进行更多讨论,请参阅fish的Array。
只是为了抛出另一个小皱纹,在某些情况下,字符串足够短,以至于它们直接编码到指针本身。 (这也适用于数字。)请参阅Mike Ash的Tagged Pointer Strings作为一个很好的介绍。所以有时指针是整个对象而没有分配任何其他东西。
基本上,你从C ++带来的许多直觉都不适用于Cocoa。 C ++鼓励你仔细思考如何在幕后实现。 Cocoa鼓励您只需写入API并相信Apple会使其在其平台上的大多数常见用例都具有高性能。如果你试图猜测Apple,那么当底层实现发生变化时,你很容易被烧毁。 (当然,有时你必须深入研究细节以解决性能问题;它在每个阶段都不会像C ++那样经常被鼓励。)