Я бы написал так:
- (void) testCall: (int *) aMatrice;
Это позволяет вам избежать нескольких malloc, и математика для вычисления одного смещения в линейном массиве на основе координат x, y в 2D-массиве является тривиальной. Это также позволяет избежать множественных mallocs, подразумеваемых int **, и ограничений синтаксиса 2D-массивов, сохраняемых языком.
Итак, если вам нужен массив 4x5, вы можете сделать:
#define WIDTH 4
#define HEIGHT 5
#define INDEXOF(x,y) ((y*WIDTH) + x)
int *myArray = malloc(sizeof(int) * 5 * ELEMS_PER_ROW);
Затем можно инициализировать массив линейно или с помощью вложенного цикла for:
for(int x=0; x<width; x++)
for(int y=0; y<height; y++)
myArray[INDEXOF(x,y)] = ... some value ...;
И вы передадите его методу:
[foo testCall: myArray];
Хотя вы, возможно, захотите также нести ширину и высоту или, что еще лучше, создать подкласс IntMatrix NSObject, который обернет всю арифметику и хранилище указателей за пределы красивого чистого API.
(весь код набран в SO)