2013-04-23 57 views
0

我想实现在Objective-C的int n×n的多维数组,而且由于使用的NSMutableArray似乎是太多的开销,我决定只使用C'S来实现它malloc和免费。我的问题是,ARC Objective-C下的代码是否正确(无内存泄漏)?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 

如果这是不正确,或者如果你想有一个肯定更好的方式来做到这一点在Objective-C没有做mallocs,请告诉我。谢谢。

+2

为什么'NSMutableArray'太多的开销?您是否使用仪器来识别性能问题? – 2013-04-23 12:07:42

+1

如果您使用'calloc'而不是'malloc',则不需要清零数组内容。 – 2013-04-23 12:24:31

+2

在迂回的一面注意:你应该使用NULL而不是nil作为你的数组指针。 nil旨在用于Obj-C对象指针。 – Nicky 2013-04-23 12:28:39

回答

6

ARC实现自动存储器管理Objective-C对象,但不 自动化的malloc /免费。 (参考文献:Clang/ARC documentation: GeneralARC Release Notes: FAQ

所以你的问题是无关的ARC:一切你malloc()必须 free()“d(和dealloc是这样做的好地方)。从第一眼看你的代码看起来不错。

(小注:在dealloc归零数组指针是没有必要的,但 NULL将是适当的指针值分配,nil是为Objective-C的对象。)

我不知道多少使用Objective-C集合(例如NSMutableArray )的开销会导致应通过分析测试(如评论中所述)。

+0

我发现使用一个单一的分配和直接的数学比嵌套分配更容易。 http://stackoverflow.com/questions/4848768/obj-c-and-multi-dimensional-arrays – bbum 2013-04-23 13:49:37

+0

非常感谢nil vs NULL的评论。 – agro1986 2013-05-05 11:51:33