2013-02-17 4 views
1

Я создаю много 2D-массивов int и float C и собираюсь назначить их указатели на NSPointerArray. Все хорошо, когда я создаю и заполняю их данными, но когда я добавляю addPointer в массив, я получаю EXEC_BAD_ACCESS. Q1-Почему это неправильно? Q2-Каков наилучший подход, обеспечивающий доступ ко многим 2D-массивам, созданным с помощью calloc?2D-массивы в NSPointerArray

- (NSPointerArray *)treeData{ 
    if (_treeData == nil) { 
     _treeData = [[NSPointerArray alloc] init]; 
     int** VVD = createIntArray(3000,200); 
     [_treeData addPointer:VVD]; 
    } 
    return _treeData; // addеd later to the post, exists in live code 
} 

Для справки

int** createIntArray(int n, int m) 
{  
    int i=0; 
    int* values = calloc(m*n, sizeof(int)); 
    int** rows = malloc(n*sizeof(int*)); 
    for (i=0; i<n; ++i) 
    { 
     rows[i] = values + i*m; 
    } 
    return rows; 

}

+1

обычно это стандартная практика, что функция абонента отвечает за выделения и освобождения памяти, не функции, которую он вызывает. –

+1

@ Арам Кочарян - это абсолютно неверное предположение. ИМО. ленивые получатели распределяют данные все время, пока вызывающий не должен это знать! и это прекрасно, в этом случае ** название говорит ему **, что он должен позже освободить массив! в dealloc или так –

+0

все массивы должны оставаться и быть доступными до выхода программы. массив tree_data со всеми двумерными массивами в нем должен быть доступен для других методов все время. –

ответ

1

NSPointerArray должен быть inited с нужными опциями. по умолчанию он пытается RETAIN передать указатели, и поскольку int ** не является NSObject, он сбой. Вместо этого вы должны сообщить массиву, чтобы он не касался памяти, которую вы добавляете! инициализировать его с непрозрачными параметрами памяти

вы называетесь просто INIT, который равен initWithOptions: NSPointerFunctionsStrongMemory
вы должны позвонить initWithOptions:NSPointerFunctionsOpaqueMemory

#import <Foundation/Foundation.h> 

int** createIntArray(int n, int m) 
{ 
    int i=0; 
    int* values = calloc(m*n, sizeof(int)); 
    int** rows = malloc(n*sizeof(int*)); 
    for (i=0; i<n; ++i) 
    { 
     rows[i] = values + i*m; 
    } 
    return rows; 
} 

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
     id _treeData = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsOpaqueMemory]; 
     int** VVD = createIntArray(3000,200); 
     [_treeData addPointer:VVD]; 
    } 

    NSLog(@"EOF"); 
}  
+0

_treeData = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsStrongMemory]; Еще craches в [_treeData addPointer: ВСД] ; 0x7fff8fd7d718: jmpq * 104 (% Ракс) EXEC_BAD_ACCESS –

+0

как я писал "initWithOptions: NSPointerFunctionsOpaqueMemory" –

+0

@JanisJakaitis не имеют дело с памятью, которые можно рассматривать как сильный! «Только» NSObjects могут быть сохранены и выпущены. Вы имеете дело с непрозрачной памятью, время выполнения не должно касаться –

Смежные вопросы