对象数组的内存分配 - 我的理解是否有效?

时间:2012-04-23 03:05:52

标签: objective-c cocoa memory object alloc

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

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

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

首先,我宣布了我的对象:

    NSObject *myObject[1000]; // a maximum number of objects.

然后,当用户单击“添加”按钮时,它会运行一个带有分配代码的方法:(注意:变量i的值从1开始,每次单击“添加”按钮时都会增加)

    ++i
    myObject[i] = [[NSObject alloc] init];

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

我是否正确地解释了这一点?换句话说,我的解释是正确的,声明中声明的数组元素的数量是MAXIMUM可能的数组元素数,而不是那时分配了多少内存?这是正确的,然后在理论上,声明:

    NSObject *myObject[10000];

不会比声明更多地记忆:

    NSObject *myObject[5];

有人可以确认我正确地理解了这个过程,如果我在脑子里把这个混淆了,请告诉我。 :)

谢谢!

2 个答案:

答案 0 :(得分:4)

为什么不使用NSMutableArray?您可以使用initWithCapacity或仅使用[NSMutableArray array]进行分配。在添加和删除对象时,它会增长和缩小。例如:

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]; 

答案 1 :(得分:3)

您的理解大多是正确的。当你这样做时:

NSObject *myObject[1000];

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

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

请记住,这两个事物都消耗空间,指向NSObject的指针和NSObject实例本身,但实际上NSObject实例消耗的空间将远远大于NSMutableArray实例。引用它的指针占用4个字节。

无论如何,也许更重要的是,有一种更好的方法来管理Cocoa中的动态对象分配。使用内置的NSMutableArray* objects = [[NSMutableArray alloc] init]; [objects addObject: [[[NSObject alloc] init] autorelease]]; 类。像:

{{1}}