3

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

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

在我对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];

有人可以确认我是否正确理解了这个过程,如果我把这件事弄混了,请赐教。:)

谢谢!

4

2 回答 2

4

为什么不使用 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]; 
于 2012-04-23T03:15:23.823 回答
3

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

NSObject *myObject[1000];

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

但是,doingNSObject *myObject[10000]会比 doing 消耗更多的空间NSObject *myObject[5],因为 10,000 个指针肯定比 5 个指针需要更多的内存来表示。

请记住,这两个东西都会消耗空间,指向 的指针NSObjectNSObject实例本身,尽管实际上NSObject实例消耗的空间将明显大于引用它的指针消耗的 4 个字节。

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

NSMutableArray* objects = [[NSMutableArray alloc] init];
[objects addObject: [[[NSObject alloc] init] autorelease]];
于 2012-04-23T03:12:39.067 回答