2011-11-14 35 views
8

thể trùng lặp:
What's the difference between [NSNull null] and nil?
What are the differences between nil, NULL and [NSNULL nil]?một số nhầm lẫn về [NSNull null], nil

1.

id dicValue = [aDictionary objetForKey:@"aKey"]; 

if(dicValue != nil) 
{ 
    blablala... 
} 

hoặc

2.

if(dicValue != [NSNull null]) 
{ 
    blablala... 
} 

tôi nên chọn cái đầu tiên, hoặc thứ hai?

hoặc khi nói như thế này:

3.

if ([aDictionary objetForKey:@"aKey"] != nil) 

hoặc

4.

if ([aDictionary objetForKey:@"aKey"] != [NSNull null]) 

và những gì nữa?

1.2.3.4. đó là chính xác và khuyến cáo?

Trả lời

18

Trực tiếp từ Apple Documentation.
Lớp NSNull định nghĩa một đối tượng đơn lẻ mà bạn sử dụng để biểu diễn các giá trị null trong các trường hợp không bị cấm làm giá trị (thường là trong đối tượng bộ sưu tập chẳng hạn như mảng hoặc từ điển).

NSNull *nullValue = [NSNull null]; 
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue]; 
NSLog(@"arrayWithNull: %@", arrayWithNull); 
// output: "arrayWithNull: (<null>)" 

Điều quan trọng là phải đánh giá cao trường hợp NSNull khác ngữ nghĩa với NO hoặc false — cả hai giá trị này đều đại diện cho giá trị logic; Ví dụ NSNull thể hiện sự vắng mặt của một giá trị. Ví dụ NSNull tương đương về mặt ngữ nghĩa với nil, tuy nhiên nó cũng quan trọng để đánh giá cao nó không bằng nil. Để kiểm tra giá trị đối tượng null, bạn phải thực hiện so sánh đối tượng trực tiếp.

id aValue = [arrayWithNull objectAtIndex:0]; 
if (aValue == nil) { 
    NSLog(@"equals nil"); 
} else if (aValue == [NSNull null]) { 
    NSLog(@"equals NSNull instance"); 
    if ([aValue isEqual:nil]) { 
     NSLog(@"isEqual:nil"); 
    } 
} 
// output: "equals NSNull instance" 

Bây giờ đã rõ chưa ??

+0

loại , cảm ơn! – Patrick

+0

điều này đã giúp rất nhiều cảm ơn bạn! đang tìm kiếm các toán tử so sánh trên SO – Jake

0

Trong trường hợp này, bạn nên sử dụng giá trị đầu tiên; hay đúng hơn, sự thay đổi nhỏ:

if (dicValue) { 
    // blablabla... 
} 

NSNull là để sử dụng khi bạn cần một đối tượng có giá trị, ví dụ như để sử dụng như một chìa khóa từ điển, nhập mảng, hoặc tương đương.

nil bằng (id)NULL; nó thường được lấy để có nghĩa là "Không có giá trị". Mặt khác,

[NSNull null] là đối tượng giữ giá trị trống; được lấy để có nghĩa là "Một giá trị của Không".

Rất ít phương thức trả lại giá trị NSNull và thường chỉ gặp phải nếu bạn tự giới thiệu nó.

Chủ yếu tồn tại vì không thể chèn vào nil vào mảng; và hoạt động như một điểm đánh dấu trống cho các mảng yêu cầu nó.


Trên ghi chú liên quan; phần "!= nil" của biểu thức của bạn thừa; bất kỳ con trỏ hợp lệ nào cho một đối tượng được đánh giá là true trong một biểu thức boolean, và nil đánh giá là false.

+0

3q, tôi biết nó là thừa, nhưng tôi vẫn muốn thêm phần "! = Nil". Làm cho mã dễ đọc! Bạn có nghĩ vậy không :) – Patrick

1

một đầu tiên có nghĩa là không quan trọng như vậy, thứ hai có nghĩa là giá trị quan trọng là NSNull

+0

Điều này rõ ràng hơn, 3q! – Patrick

3

hiểu biết của tôi được rằng NSNull là một đối tượng đại diện cho một giá trị NULL và nil chỉ là một con trỏ rỗng.

Bạn có thể điền vào một NSArray với các đối tượng NSNull và nó sẽ trả về giá trị null, nhưng bạn không thể điền nó bằng nils.

Bạn có thể làm

[myNsMutableArray addObject:[NSNull null]]; 

nhưng đây sẽ sụp đổ:

[myNsMutableArray addObject:nil]; 

Tương tự như vậy:

[[NSMutableArray alloc] initWithObjects:@"1", nil, @"2", nil]; 
[[NSMutableArray alloc] initWithObjects:@"1", [NSNull null], @"2", nil]; 

Mảng đầu tiên, khi in sẽ ra "1" thứ hai sẽ xuất: "1, null, 2"

Vì vậy, bạn có thể sử dụng NSNull để biểu diễn các khoảng trống trong một mảng.

Bạn không thể chèn nil vào từ điển. Vì vậy, kiểm tra cho nó có nghĩa là chìa khóa không tồn tại. Nếu bạn kiểm tra NSNull nó có nghĩa là khóa tồn tại nhưng giữ một giá trị rỗng (NSNull).

+0

3q, điều này giúp ích rất nhiều! – Patrick

+0

Tôi rất vui vì điều đó. Chấp nhận câu trả lời sau đó :) – Odrakir