【发布时间】:2012-05-03 16:45:37
【问题描述】:
我有一个关于数组中对象的内存分配的问题。我希望创建一个对象数组,但在编译时,我无法知道需要多少对象,因此不想保留比需要更多的内存。
我想做的是根据需要分配内存。我想这样做的方式是当用户单击“添加”按钮时,数组会增加一个额外的对象,并分配新对象所需的内存。
在我对Objective C的新手理解中(大约20年前我是一名专业程序员,最近才开始重新编写代码)我想出了以下代码段:
首先,我声明了我的对象:
NSObject *myObject[1000]; // a maximum number of objects.
然后,当用户单击“添加”按钮时,它会运行一个带有分配代码的方法:(注意:变量 i 从值 1 开始,每次单击“添加”按钮时都会增加)
++i
myObject[i] = [[NSObject alloc] init];
因此,我希望只为实际需要的对象分配内存,而不是立即为所有 1000 个数组对象分配内存。
我的解释正确吗?换句话说,我的解释是否正确,声明中声明的数组元素的数量是数组元素的最大可能数量,而不是当时分配了多少内存?如果这是正确的,那么理论上,声明:
NSObject *myObject[10000];
不会比声明更多的内存:
NSObject *myObject[5];
有人可以确认我正确理解了这个过程,如果我有这个混淆,请赐教。 :)
谢谢!
【问题讨论】:
-
为什么不使用 NSMutableArray 或 CFMutableArray?它有效地添加对象。这里是 CFArray 的源代码,如果你想看看:opensource.apple.com/source/CF/CF-635/CFArray.c
-
感谢您的提示。我确信这可能是我应该这样做的方式。直到现在我都没有听说过其中任何一个。奇怪的是,虽然我知道我可能在重新发明轮子,但理论上我对内存分配的理解是否准确?
-
永远不要使用 Objective-C 对象的 C 数组,这是个坏主意。使用语言提供的数组对象。我强烈推荐你阅读一本 Objective-C 的书。最好的(恕我直言)是 Programming In Objective-C,作者是 Stephen Kochan。
-
此外,您还可以通过 CFArray/NSArray 获得许多有用的方法/功能。使用 NSArray,你可以做一些花哨的事情,比如
-makeObjectsPerformSelector:让它们都调用一个方法,或者使用块或使用for (<class name> *<object name> in <array name>){// do stuff}的 Objective-C 快速枚举 -
Rob - 我有那本特别的 Objective-C 书,并且一直在研究它。我只是碰巧在前进并进行实验……有时这会有所帮助,有时会像这种情况一样将我引向完全错误的方向:)
标签: objective-c cocoa memory object alloc