如何在Objective-C中动态分配指向对象的指针数组?

Posted

技术标签:

【中文标题】如何在Objective-C中动态分配指向对象的指针数组?【英文标题】:How to dynamically allocate array of pointers to objects in Objective-C? 【发布时间】:2010-02-22 03:58:17 【问题描述】:

我正在尝试提高我的应用程序的性能,我想从我当前使用的 NSMutableArray 更改为动态分配的 C 数组。

作为测试,我创建了这个类:

在我的课堂界面中,我有:

MyObject *myObjectArray;

在我的实现中,初始化对象后,我有另一种方法来设置数组:

-(void) createObjectsWithNumberOfObjects:(int)numberOfObjects

    MyObject *tempObject = nil;
    myObjectArray = (MyObject*) malloc(numberOfObjects * sizeof(tempObject));
    for( int i = 0; i < numberOfObjects; i++ )
        tempObject = [[MyObject alloc] init];
        myObjectArray[i] = (MyObject*) tempObject; // error
    

我收到以下错误: 分配中的不兼容类型

那我做错了什么?

是否可以像这样使用动态分配的对象数组?

另外,在我的 dealloc 方法中,我设置为在每个对象上调用 release 然后 free(myObjectArray)

【问题讨论】:

【参考方案1】:

你需要更多*s。将数组指针声明为:

MyObject **myObjectArray;

然后像这样初始化它:

myObjectArray = (MyObject**) malloc(numberOfObjects * sizeof(MyObject *));

让您的代码中的其他所有内容与现在相同,您应该会很好!为什么要从NSMutableArray 更改?就灵活性和 Cocoa 支持而言,它比您的 C 数组更有能力。

【讨论】:

@Big Dogg,如果您有性能问题,我可以保证NSMutableArray 不是原因... 没有性能问题(还)。我很好奇使用标准 C 数组与 NSMutableArray 的性能增益。每帧访问大约一百个对象,我认为会有某种性能改进。但是,您是正确的,如果出现延迟,它很可能在其他地方。 如果你真的关心性能,我建议避免过早的优化,而是使用 Instruments 和 Shark 来分析你的代码。您可能会对应用程序中的实际瓶颈感到惊讶。【参考方案2】:

您确定会大大提高性能吗? NSMutableArray 已经存在了很长时间,并且在为新元素分配更多内存方面可能比您更智能。

现在,如果您正在创建一个链接列表或其他东西,这可能会为中间插入之类的东西带来好处......但对于一个可以添加的普通数组,我不确定您有多少收益会看到的。

【讨论】:

这不是关于内存的分配,而是更多关于迭代每个元素的处理时间。当必须每秒访问许多对象 60 次时,我认为标准 C 数组会比使用 NSMutableArray 更快。但是,我可能是错的......

以上是关于如何在Objective-C中动态分配指向对象的指针数组?的主要内容,如果未能解决你的问题,请参考以下文章

在删除指向动态分配对象的指针向量中的元素之前,我需要做啥?

如何在c++中,调用objective-c

objective-c 中如何在一个函数中调用自己类中的另外一个函数

智能指针的原理及其应用

指向对象的指针数组的动态分配

为 Objective-C 数据对象分配内存的问题