Objective c 对象数组的内存分配-我的理解有效吗?

Objective c 对象数组的内存分配-我的理解有效吗?,objective-c,cocoa,memory,object,alloc,Objective C,Cocoa,Memory,Object,Alloc,我有一个关于数组中对象的内存分配的问题。我希望创建一个对象数组,但在编译时,我无法知道需要多少对象,因此不想保留超过需要的内存 我想做的是根据需要分配内存。我希望这样做的方式是,当用户单击“添加”按钮时,数组将增加一个额外的对象,并为新对象分配所需的内存 在我对Objective C的初级理解中(大约20年前我是一名专业程序员,最近才开始重新编写代码),我提出了以下代码段: 首先,我声明了我的目标: NSObject *myObject[1000]; // a maximum numbe

我有一个关于数组中对象的内存分配的问题。我希望创建一个对象数组,但在编译时,我无法知道需要多少对象,因此不想保留超过需要的内存

我想做的是根据需要分配内存。我希望这样做的方式是,当用户单击“添加”按钮时,数组将增加一个额外的对象,并为新对象分配所需的内存

在我对Objective C的初级理解中(大约20年前我是一名专业程序员,最近才开始重新编写代码),我提出了以下代码段:

首先,我声明了我的目标:

    NSObject *myObject[1000]; // a maximum number of objects.
然后,当用户单击Add按钮时,它会运行一个带有分配代码的方法:(注意:变量i的值从1开始,每次单击Add按钮时都会增加)

因此,我希望只为实际需要的对象分配内存,而不是立即分配所有1000个数组对象

我的解释正确吗?换句话说,我的解释是否正确,声明中声明的数组元素数是数组元素的最大可能数,而不是此时分配的内存量?如果这是正确的,那么理论上,声明:

    NSObject *myObject[10000];
    NSObject *myObject[5];
除了声明之外,不会占用更多内存:

    NSObject *myObject[10000];
    NSObject *myObject[5];
有人能确认我正确理解这个过程吗?如果我脑子里想的是这个问题,请告诉我。:)


谢谢

你的理解基本上是正确的。当您这样做时:

NSObject*myObject[1000]

您可以立即为1000个指向
NSObject
实例的指针分配存储空间。在执行
[[NSObject alloc]init]
之前,不会分配
NSObject
实例本身

但是,执行
NSObject*myObject[10000]
将比执行
NSObject*myObject[5]
消耗更多的空间,因为10000个指针肯定需要比5个指针更多的内存来表示

请记住,这两种情况都会占用空间,指向
NSObject
的指针和
NSObject
实例本身,尽管在实践中
NSObject
实例占用的空间将明显大于引用它的指针所占用的4个字节

无论如何,也许更重要的是,有一种更好的方法来管理Cocoa中的动态对象分配。使用内置的
NSMutableArray
类。比如:

NSMutableArray* objects = [[NSMutableArray alloc] init];
[objects addObject: [[[NSObject alloc] init] autorelease]];

为什么不使用NSMutableArray?您可以使用initWithCapacity或简单地使用[NSMutableArray]进行分配。它将随着您添加和删除对象而增长和收缩。例如:

NSMutableArray *array = [NSMutableArray array];
NSObject *object = [[NSObject alloc] init];

[array addObject:object]; // array has one object
[array removeObjectAtIndex:0]; // array is back to 0 objects

// remember to relinquish ownership of your objects if you alloc them
// the NSMutable array was autoreleased but the NSObject was not
[object release]; 

为什么不使用NSMutableArray或CFMutableArray?它可以有效地添加对象。这里是CFArray的源代码,如果你想看一看的话:谢谢你的提示。我肯定我应该这样做。直到现在我才听说这两个。奇怪的是,虽然我知道我可能在重新发明轮子,但理论上,我对内存分配的理解准确吗?永远不要使用Objective-C对象的C数组,这是个坏主意。使用该语言提供的数组对象。我强烈建议你读一本Objective-C的书。最好的一个(IMHO)是Stephen Kochan写的。另外,使用CFArray/NSArray可以获得很多有用的方法/函数。使用NSArray,您可以做一些奇特的事情,比如
-makeObjectsPerformSelector:
让它们都调用一个方法,或者使用块或
for(*in){//do stuff}
Rob,使用Objective-C快速枚举,我有一本特别的Objective-C书籍,并且一直在研究它。我只是碰巧跳到前面,边走边做实验。。。有时这会有所帮助,但有时这会让我走上一个完全错误的方向,比如在本例中:)请查看NSMutableArray和NSArray文档,看看它们还有哪些很酷的功能。NSArray在接收到对dealloc的调用时释放其所有对象。这就是为什么,例如,如果您有一个类型为
NSArray
的合成属性,则只需在
-dealloc
中释放NSArray,而不必释放其内容。@JackLawrence,这是正确的,但是对对象调用alloc会将其保留计数增加1。将该对象添加到NSArray也会将其保留计数增加到2。如果我当时没有调用[object release],那么从数组中删除该对象将使对象保留计数为1,从而防止系统回收内存。非常好的解释。谢谢我完全忘记了指针本身分配了内存这一事实。本质上,对象基本上是一种数据库记录。一个NS对象,包含一组变量和一些方法。现在,我可以使用访问器方法访问对象中的变量,例如:x=[myObject var];如果我将myObject添加到数组对象中,是否有一种简单的方法可以使用myObject的访问器方法?我敢肯定这是一个大致如下的东西:x=[[objects]var];是的,很接近。它是
x=[[objects objectAtIndex:]var]
。你可能会发现这本书很有用。