2012-09-19 83 views
1

我有以下陣列通常包含CGColor的:可能用空值初始化NSArray?

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

我有與此陣列平行一些其他陣列具有值的相同的量(即_fillColors_mutuablePaths)。我循環遍歷所有這些數組來檢查數據,在這個特殊情況下,所有的_strokeColors都必須爲NULL。但是,我注意到上面的數組的大小爲0.

初始化這樣的數組需要爲每個值讀取NULL的模式是什麼?

+0

'NULL'是一樣的'nil'並具有內存地址'0x0000000'。'[NSNull null]'是不是'nil'的對象,但是代表'nil'和'NULL'。這是你應該在這裏使用。 –

回答

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

應該這樣做。

3

這應該爲你工作:

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

您可以在陣列或任何其他集合只存儲對象類型。

NULL,實際上不是一個對象。因此,您必須使用以下形式將其作爲對象類型:[NSNull null]

3

在可可中,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]是一個singleton,保證在內存中始終保持相同的位置(這是==在這種情況下測試的結果)。不要用普通物體做這件事。

更多關於docs

2

試試這個方法 -

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