我有一个关于数组中对象的内存分配的问题。我正在寻找创建一个对象数组,但在编译时,我无法知道我需要多少个对象,因此不想保留比所需更多的内存。
我想要做的是根据需要分配内存。我想这样做的方法是当用户单击“添加”按钮时,数组会增加一个额外的对象,并分配新对象所需的内存。
在我对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];
有人可以确认我正确地理解了这个过程,如果我在脑子里把这个混淆了,请告诉我。 :)
谢谢!
答案 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}}