2013-04-23 59 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