我有以下数组,通常包含CGColor:
_strokeColors = [[NSArray alloc] initWithObjects:NULL,NULL,NULL,NULL, nil];
我有一些与此数组并行运行的其他数组(即_fillColors
,_mutuablePaths
)具有相同数量的值。我遍历所有这些数组以检查数据,在这个特定实例中,所有_strokeColors
都必须为NULL。但是,我注意到上面的数组大小为0.
初始化像这样需要为每个值读取NULL的数组的模式是什么?
答案 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*
指向nil
和char*
的指针或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];