2011-12-22 58 views
7

我有以下代碼在一個循環測試對於在目標c空

NSArray * images = [definitionDict objectForKey:@"Images"]; 
    NSLog(@"images in definitionDict %@", images); 
    if (!images) 
     NSLog(@"NULL"); 
    else 
     NSLog(@"NOTNULL"); 

其給出以下輸出

images in definitionDict (
    "/some/brol/brol.jpg" 
) 
NOTNULL 
images in definitionDict <null> 
NOTNULL 

我不理解第二種情況,其中圖像陣列是空值。爲什麼在我的測試中沒有正確檢測到?我怎樣才能調試這樣的問題?

回答

19

<null>不是nil。打印時,nil將打印(null)。你有什麼是NSNullNSNull是一個對象,它只是不太響應。它作爲一個佔位符供您使用。

爲了測試NSNull可以使用if ([images isEqual:[NSNull null]])

docs更多信息上NSNull

+0

謝謝,這解決了我。 – madewulf 2011-12-22 13:58:38

1

如果你想打印出一個Objective-C對象的內存地址,或任何其他的指針,你應該使用國旗%p而不是%@。標誌%@,需要一個字符串。

但是,如果參數不是字符串,NSLog將自動調用-description對傳遞的對象。而當該方法返回一個NSNull對象,該對象在-description返回字符串<null>

NSObject *o = nil; 
NSLog(@"%p", o); 

輸出:0x00000000

NSObject *o = [[NSObject alloc] init]; 
NSLog(@"%p", o); 
[o release]; 

輸出:0x12345678

心靈:

NSNull *n = [NSNull null]; 
NSLog(@"%p", n); 

輸出:存儲器地址總是將是相同的,但會從0x00000000

正確的方法有所不同,以測試其是否是對象在所述陣列是這樣的。

NSArray *myArray = [someObject array]; 
if([myArray isEqual:[NSNull null]]) { 
    NSLog(@"No objects"); 
} else { 
    NSLog(@"%d objects.", (int)[myArray length]; 
} 
+1

在這種情況下,您的底部解決方案會崩潰。這不是不包含任何對象的數組。這是一個NSNull,NSNull不響應長度。 – 2011-12-22 13:55:11

+0

@JoshuaWeinberg我編輯它。蘋果爲什麼要創建一個'NSNull'類似乎還是個謎。特別是爲什麼要在NSDictionary中設置一個NSNull對象。如果你只是不定義該鍵,那麼該方法仍然會返回'nil'。 – v1Axvw 2011-12-22 13:57:40

+0

在這種情況下,您需要能夠區分沒有對象,有空對象的詩句。 'nil'只是零,如果鍵不存在,它也會返回。所以在這裏,我想在將一些JSON解析爲一個JSON爲null的字典之後,創建了一個「NSNull」。 – 2011-12-22 14:00:06