декларация NSArray и указатели вопрос о безопасности? - PullRequest
1 голос
/ 13 июля 2011

Желаемый результат - построить 10 столбцов в NSArray.Следующее работает с тем, что похоже на желаемый результат.
Но я играю с огнем здесь?

NSArray **ppp;

int m=10;

ppp = calloc(m, sizeof(NSArray));

ppp[0]=[[NSArray alloc] initWithObjects:
                 @"1",
                 @"2",
                 @"3",
                 ];

ppp[1]=[[NSArray alloc] initWithObjects:
            @"a1",
            @"b2",
            @"c3",
            @"d4",
            nil
            ];

NSLog(@"array test: %@   %@", [ppp[1] objectAtIndex:3], [ppp[0] objectAtIndex:2]);

спасибо

Ответы [ 3 ]

3 голосов
/ 13 июля 2011

Это должно быть sizeof(id), но в остальном это правильный код.Но здесь есть некоторый «взрывной» потенциал, поскольку это сделает управление памятью намного более сложным и подверженным ошибкам, чем использование NSArray (поскольку массивы C полностью игнорируют требования Objective-C к управлению памятью).Если вы не профилировали и не нашли это необходимым, я бы усомнился в этом.

3 голосов
/ 13 июля 2011

Вы должны, если вы собираетесь, сделать

ppp = calloc(m, sizeof(NSArray *));

но этот путь потребует ручного управления памятью массива массивов. Почему бы вам не использовать NSMutableArray экземпляр.

NSMutableArray * masterArray = [NSMutableArray array];
[masterArray addObject:[[NSArray alloc] initWithObjects:
                 @"1",
                 @"2",
                 @"3",
                 ]];

.....

NSLog(@"array test: %@ ", [[masterArray objectAtIndex:1] objectAtIndex:3]);
1 голос
/ 13 июля 2011

С вашим каллоком все не так.Если вам нужен буфер с 10 объектами NSArray, выполните:

NSArray** ppp;
int m = 10;
ppp = calloc(m, sizeof(NSArray*));

...

Проблема в том, что sizeof (int)! = Sizeof (id) на некоторых архитектурах.Вы сами занимаетесь коротким листом, разбиваете кучу и получаете исключение malloc, когда пишете за концом массива.Кроме того, ошибку будет трудно найти.

Я согласен с InsertWittyName: просто создайте NSArray из NSArray's.Это проще и безопаснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...