Objective C对象的C数组

时间:2010-12-05 00:35:43

标签: objective-c c malloc

我正在尝试使用malloc创建一个目标C NSStrings的C数组。我做得不对,但我认为我离得很远。也许有人可以指出我正确的方向。 假设为了参数,我们在数组中需要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 个答案:

答案 0 :(得分:2)

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不保证返回的缓冲区的内容,因此请将所有内容明确地设置为nilcalloc在这里不会对您有所帮助,因为零模式与nil / NULL不是一回事。

编辑:尽管在i386和arm上零和null可能相同,但它们在概念上并不相同,就像NULL and nil are strictly not the same一样。最好定义类似

的内容
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 :(得分:1)

我想出了问题 - 我应该使用calloc,而不是malloc。而malloc只是分配内存,calloc

  

连续为每个大小为内存字节的计数对象分配足够的空间,并返回指向已分配内存的指针。分配的内存用零值的字节填充。

这意味着你得到一个nil对象的数组,基本上就像在目标c中,0x0是nil对象。

答案 2 :(得分:1)

一个问题是:

self->ourArray = malloc(5 * sizeof(NSString *));  // notice the sizeof()