可以使用空值初始化NSArray吗?

时间:2012-09-19 07:28:33

标签: iphone objective-c ios cocoa-touch nsarray

我有以下数组,通常包含CGColor:

_strokeColors = [[NSArray alloc] initWithObjects:NULL,NULL,NULL,NULL, nil];

我有一些与此数组并行运行的其他数组(即_fillColors_mutuablePaths)具有相同数量的值。我遍历所有这些数组以检查数据,在这个特定实例中,所有_strokeColors都必须为NULL。但是,我注意到上面的数组大小为0.

初始化像这样需要为每个值读取NULL的数组的模式是什么?

4 个答案:

答案 0 :(得分:10)

_strokeColors = [[NSArray alloc] initWithObjects:[NSNull null],[NSNull null],[NSNull null],[NSNull null], nil];

应该这样做。

答案 1 :(得分:3)

这应该适合你:

_strokeColors = [[NSArray alloc] initWithObjects:[NSNull null],[NSNull null],[NSNull null],[NSNull null], nil];

您只能将对象类型存储在数组或任何其他集合中。

NULL,实际上不是对象。因此,您必须使用以下函数将其设置为对象类型:[NSNull null]

答案 2 :(得分:3)

在Cocoa中,NULL并未真正使用,但通常保留用于使用标准C指针的情况。

由于Objective-C也是C,这当然只是一个惯例,但是很有用 - 它允许你设置NSString*指向nilchar*的指针或void*指向NULL的指针,并一目了然地注意到差异。

此外,在Cocoa中,集合(数组,字典,集合)不能保存nil值,因此正如其他海报所指出的那样,您必须使用占位符,即[NSNull null]

但请注意[NSNull null]就是占位符,并且由于集合只能容纳对象,因此该占位符也是标准的Objective-C对象。

因此,如果在条件语句中使用它,则需要对其进行正确测试,例如:

id myVar = [NSNull null];

// Stuff...

if ( myVar == [NSNull null] ) {
     // myVar has not been changed, do something
}

这与标准C语言不同,您可以在条件语句中直接测试NULL值:

void *myPointer = NULL;

// Stuff...

if ( myPointer ) {
    // More stuff if pointer uninitialized
}

您可能也想知道为什么使用[NSNull null]运算符来测试变量是否与==完全相同?这是因为[NSNull null]是一个单例,保证在内存中始终具有相同的位置(在这种情况下是==测试的)。不要用普通物体做到这一点。

有关docs的更多信息。

答案 3 :(得分:2)

尝试此方法 -

_strokeColors = [[NSArray alloc] initWithObjects:[NSNull null],[NSNull null],[NSNull null],[NSNull null], nil];