Одна проблема NSMutableArray - PullRequest
       1

Одна проблема NSMutableArray

0 голосов
/ 02 августа 2010

код:

 typedef struct _Package 
{
    char* data;
    int dataLen;
}Package;

Package *pack=(Package *)malloc(sizeof(pack));
pack->dataLen = 10;
pack->data = (char *)malloc(10);
strcpy(pack->data,"hellohello");

NSMutableArray *lstPack = [[NSMutableArray alloc] init];
[lstPack addobjec:pack];

когда программа переходит [lstPack addobject: pack], она не может продолжаться.Если вы знаете причину ,, пожалуйста, скажите мне。

Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 августа 2010

Вы можете добавлять в контейнеры obj-c (включая NSMutableArray) только объекты obj-c. Чтобы добавить c-структуру в массив, вы можете поместить ее в объект NSValue:

[lstPack addObject:[NSValue valueWithPointer:pack]];

Позже вы получите доступ к сохраненному значению:

Package* pack = (Package*)[[lstPack objectAtIndex:i] pointerValue];

Обратите внимание, что в этой строке, возможно, имеется опечатка - имя метода неверное.

0 голосов
/ 03 августа 2010

Вместо этого вы можете создать CFMutableArray, который может обрабатывать массивы произвольных объектов, и вы можете использовать его как NSMutableArray (по большей части).

// create the array
NSMutableArray *lstPack = (NSMutableArray *) CFArrayCreateMutable(NULL, 0, NULL);

// add an item
[lstPack addObject:pack];

// get an item
Pack *anObject = (Pack *) [lstPack objectAtIndex:0];    

// don't forget to release
// (because we obtained it from a function with "Create" in its name)
[lstPack release];

Параметры дляCFArrayCreateMutable:

  1. Распределитель, используемый для массива.Предоставление NULL здесь означает использование распределителя по умолчанию.
  2. Ограничение на размер массива.0 означает отсутствие ограничения, любое другое целое число означает, что массив создается только для того, чтобы содержать ровно столько элементов или меньше.
  3. Последний параметр - это указатель на структуру, содержащую указатели на функции.Более подробную информацию можно найти здесь .Предоставляя NULL здесь, это означает, что вы не хотите, чтобы массив что-либо делал со значениями, которые вы ему задали.Обычно для NSMutableArray это будут retain объекты, которые к нему добавляются, и release объекты, которые удаляются из него¹, но CFMutableArray, созданный без обратных вызовов, не будет этого делать.

¹ Причина, по которой ваш код дает сбой, состоит в том, что NSMutableArray пытается отправить retain в вашу Pack структуру, но, конечно, это не объект Objective-C, поэтому он бомбит.

0 голосов
/ 03 августа 2010

«… в результате p-> data равна нулю…» - возможно, из-за pack->dataLen = (char *)malloc(10); Я думаю, вы хотели сделать pack->data = (char *)malloc(10); вместо?

Привет

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