Câu trả lời:
nilchỉ 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).
contextin observeValueForKeyPath:ofObject:change:context:là void *, điều đó không có nghĩa là dữ liệu được truyền dưới dạng contextcó 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 NULLthay 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:
nillà sử dụng idkiểu gì (và con trỏ tới đối tượng).NULLlà 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 .
NULLlà C equivalentcủ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 đó NULLdành cho con trỏ loại C và được đánh máy (void *).