我正在尝试使用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语句。
答案 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
不保证返回的缓冲区的内容,因此请将所有内容明确地设置为nil
。 calloc
在这里不会对您有所帮助,因为零模式与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()