ARC Objective-C中的C风格多维数组

时间:2013-04-23 12:05:07

标签: objective-c c arrays multidimensional-array

我试图在Objective-C中实现一个n x n多维数组的int,并且因为使用NSMutableArray似乎是一个太大的开销,所以我决定只使用C&C的malloc和free来实现它。我的问题是,ARC Objective-C下的代码是否正确(没有内存泄漏)?

@interface TwoDimensionalArray
{
    int **array;
    int size;
}
@end

@implementation TwoDimensionalArray
- (id)initWithSize: (int)s
{
    if(self = [super init])
    {
        size = s;
        array = malloc(sizeof(int*) * size);
        for(int i = 0; i < size; i++)
        {
            array[i] = malloc(sizeof(int) * size);
            for (int j = 0; j < size; j++)
            {
                array[i][j] = 0;
            }
        }
    }
    return self
}
- (id)init
{
    return [self initWithSize:1];
}
- (void)dealloc
{
    for(int i = 0; i < size; i++)
    {
        free(array[i]);
        array[i] = nil;
    }
    free(array);
    array = nil;
}
@end

如果这不正确,或者你认为在没有做mallocs的情况下在Objective-C中有更好的方法,请告诉我。感谢。

1 个答案:

答案 0 :(得分:6)

ARC为 Objective-C对象实现自动内存管理,但不实现 自动化 malloc / free 。 (参考文献:Clang/ARC documentation: GeneralARC Release Notes: FAQ。)

所以你的问题与ARC无关:你malloc()所必须的一切 free()'d(而dealloc是个好地方)。从第一眼看,你的代码看起来还不错。

(小记:将dealloc中的数组指针归零不是必需的,但是 NULL将是要分配的适当指针值,nil适用于Objective-C对象。)

我不知道使用Objective-C集合(例如NSMutableArray)需要多少开销 会导致,应该通过剖析测试(如评论中已经说过的那样)。