2011-12-22 21 views
7

Tôi có đoạn code sau trong một vòng lặpTesting for null trong Objective-C

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

mang đến cho các kết quả sau

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

Tôi không hiểu trường hợp thứ hai, nơi các mảng hình ảnh là vô giá trị. Tại sao điều này không được phát hiện chính xác trong thử nghiệm của tôi? Làm thế nào tôi có thể gỡ lỗi một vấn đề như vậy?

Trả lời

19

<null> không phải là nil. nil sẽ in (null) khi in. Những gì bạn có là NSNull. NSNull IS là một đối tượng, nó chỉ không trả lời nhiều. Có sẵn như một trình giữ chỗ cho bạn sử dụng.

Để kiểm tra cho NSNull bạn có thể sử dụng if ([images isEqual:[NSNull null]])

Xem docs để biết thêm về NSNull

+0

Cảm ơn, điều đó đã giải quyết được cho tôi. – madewulf

1

Nếu bạn muốn in ra địa chỉ bộ nhớ của một đối tượng Objective-C, hoặc bất kỳ con trỏ khác, bạn nên sử dụng cờ %p không phải %@. Cờ %@, dự kiến ​​một chuỗi.

Tuy nhiên, nếu đối số không phải là chuỗi, thì NSLog sẽ tự động gọi -description trên đối tượng được truyền. Và khi phương thức trả về một đối tượng NSNull, các -description trên đối tượng đó trả về chuỗi <null>

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

Output:0x00000000

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

Output: cái gì đó như 0x12345678

tâm:

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

Output: một địa chỉ bộ nhớ mà sẽ luôn là như nhau, nhưng sẽ khác với 0x00000000

Cách đúng để kiểm tra xem họ là những đối tượng trong mảng là như thế này.

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

Giải pháp của bạn ở phía dưới sẽ sụp đổ trong tình huống này. Đây không phải là một mảng không chứa các đối tượng. Đó là một NSNull, và NSNull không đáp ứng với chiều dài. –

+0

@JoshuaWeinberg Tôi đã chỉnh sửa nó. Nó vẫn có vẻ giống như một bí ẩn tại sao Apple tạo ra một lớp 'NSNull'. Và đặc biệt là tại sao một người đặt một đối tượng NSNull trong một 'NSDictionary'. Nếu bạn chỉ không định nghĩa khóa, thì phương thức sẽ vẫn trả về 'nil'. – v1Axvw

+0

Trong trường hợp này, bạn cần để có thể phân biệt không có đối tượng, câu có một đối tượng null. 'nil' chỉ bằng 0, nó cũng trả lại nếu khóa không tồn tại. Vì vậy, ở đây, tôi sẽ tưởng tượng sau khi phân tích cú pháp một số JSON thành một từ điển có một JSON 'null' trong nó, một' NSNull' được tạo ra. –