C массив объектов Objective C - PullRequest
       32

C массив объектов Objective C

0 голосов
/ 05 декабря 2010

Я пытаюсь создать массив C целевых строк C NSStrings, используя malloc. Я не делаю это правильно, но я не думаю, что я далеко. Может быть, кто-то может указать мне в правильном направлении. Допустим, мы хотим, чтобы в нашем массиве было 5 строк для аргумента.

Интерфейс:

@interface someObject : NSObject {
    NSString **ourArray;
}
@property () NSString **ourArray;
@end

Реализация:

@implementation someObject
@synthesize ourArray;

-(id)init {
    if((self = [super init])) {
        self->ourArray = malloc(5 * sizeof(NSString *));
    }
    return self;
}

-(NSString *)getStringAtPos3 {
    if(self.ourArray[3] == nil) {
        self.ourArray[3] = @"a string";
    }
    return self.ourArray[3];
}
@end

Когда я устанавливаю точку останова в getStringAtPos3, он не видит элемент массива как nil, поэтому никогда не входит в оператор if.

Ответы [ 3 ]

2 голосов
/ 05 декабря 2010

malloc Создание массива указателей выполняется следующим образом:

self->ourArray = malloc(5 * sizeof(NSString *));
if (self->ourArray == NULL)
    /* handle error */
for (int i=0; i<5; i++)
    self->ourArray[i] = nil;

malloc не дает никаких гарантий относительно содержимого возвращаемого буфера, поэтому явно установите все в nil. calloc здесь вам не поможет, так как нулевой паттерн и nil / NULL не одно и то же.

Редактировать : даже если ноль и ноль могут быть одинаковыми на i386 и arm, концептуально они не одинаковы, точно так же как NULL и nil строго не совпадают . Желательно определить что-то вроде

void *allocStringPtrs(size_t n)
{
    void *p = malloc(sizeof(NSString *));
    if (p == NULL)
        // throw an exception
    for (size_t i=0; i<n; i++)
        p[i] = nil;
    return p;
}
1 голос
/ 05 декабря 2010

Одна проблема заключается в следующем:

self->ourArray = malloc(5 * sizeof(NSString *));  // notice the sizeof()
1 голос
/ 05 декабря 2010

Я выяснил проблему - я должен был использовать calloc, а не malloc. В то время как malloc просто выделяет память, calloc

непрерывно выделяет достаточно места для объектов подсчета, каждый из которых имеет размер в байтах памяти, и возвращает указатель на выделенную память. Выделенная память заполнена байтами нулевого значения.

Это означает, что вы получаете массив объектов nil, по сути, так как в цели c 0x0 является объектом nil.

...