1

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

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

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

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

4

4 回答 4

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

应该做的伎俩。

于 2012-09-19T07:30:18.723 回答
3

这应该适合你:

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

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

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

于 2012-09-19T07:31:37.673 回答
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]它是一个单例,保证在内存中始终具有相同的位置(==在这种情况下这是测试的内容)。不要对普通对象执行此操作。

更多关于它的文档

于 2012-09-19T07:47:55.717 回答
2

试试这个方法 -

_strokeColors = [[NSArray alloc] initWithObjects:[NSNull null],[NSNull null],[NSNull null],[NSNull null], nil];
于 2012-09-19T08:29:55.267 回答