Câu trả lời:
nil
chỉ nên được sử dụng thay cho một id
, những gì mà các lập trình viên Java và C ++ của chúng tôi sẽ nghĩ là một con trỏ tới một đối tượng. Sử dụngNULL
cho con trỏ không đối tượng.
Nhìn vào tuyên bố của phương pháp đó:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
Bối cảnh là một void *
(tức là một con trỏ kiểu C), vì vậy bạn chắc chắn sẽ sử dụng NULL
(đôi khi được khai báo là (void *)0
) chứ không phải nil
(đó là loại id
).
context
in observeValueForKeyPath:ofObject:change:context:
là void *
, điều đó không có nghĩa là dữ liệu được truyền dưới dạng context
có thể là một con trỏ đối tượng? Tôi sẽ nghĩ rằng đó là một trường hợp phổ biến. Đó là lý do tại sao tôi bối rối về lý do tại sao các tài liệu luôn sử dụng NULL
thay vì nil
.
Về mặt kỹ thuật chúng giống nhau (0), nhưng nil thường được sử dụng cho loại đối tượng Objective-C, trong khi NULL được sử dụng cho con trỏ kiểu c (void *).
Về mặt kỹ thuật chúng giống nhau và chỉ khác nhau về kiểu dáng:
nil
là sử dụng id
kiểu gì (và con trỏ tới đối tượng).NULL
là những gì bạn sử dụng cho void *
.0
.Tôi thường sử dụng biến thể phù hợp với ngôn ngữ nơi loại được khai báo .
NULL
là C equivalent
của nil
, một con trỏ đến không có gì;
nơi nil is zero typed as id
,
NULL is zero typed as void*
.
Một điểm quan trọng bạn không thể gửi tin nhắn đến NULL. Vì vậy, nó được ưa thích để sử dụng nil trong mục tiêu-C ở nhiều nơi.
Họ gần như là những điều tương tự ngoại trừ,
nil
được sử dụng theo kiểu Objective-C. trong đó NULL
dành cho con trỏ loại C và được đánh máy (void *)
.