NULL vs nil trong Objective-C


182

Trong observeValueForKeyPath:ofObject:change:context:- tại sao các tài liệu sử dụng NULLthay vì nilkhi không chỉ định một con trỏ ngữ cảnh?


theo tôi, đối tượng là con số không, lớp là Nil và NULL sử dụng cho đối tượng hoặc lớp
Thanh Vũ Trần

Câu trả lời:


227

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).


2
Nhưng vì kiểu contextin observeValueForKeyPath:ofObject:change:context: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.
erikprice

2
Loại bối cảnh: trong phương thức đó là "void *". "Nil" không phải là "void *", nhưng NULL thì có.
Paul Tomblin

3
Bạn có thể. void * là bất kỳ con trỏ nào. Tuy nhiên, bạn hoàn toàn đúng khi NULL là hằng số chính xác ở đó.
Peter Hosey

3
Họ nói khoảng trống *. NULL là cho void * và nil là cho id. Do đó, bạn vượt qua NULL. Nếu bạn vượt qua con số không, bạn đang nói dối với độc giả của mình, người sẽ nghĩ rằng phương pháp này cần một id.
Peter Hosey

12
Hoặc nghĩ theo một cách khác, NULL là một loại rộng hơn và nil là một tập hợp con của NULL. Nói chung, hãy sử dụng loại rộng nhất mà bạn có thể sử dụng (ví dụ như trong Java, viết phương thức của bạn để mong đợi Bộ sưu tập thay vì Vector, trừ khi bạn cần một cái gì đó cụ thể từ Vector)
Paul Tomblin

65

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 *).


8
Ngoài ra, NULLđược định nghĩa khác hơn nil. nilđược định nghĩa là (id)0. NULLkhông phải.

14
@WTP nếu bạn đọc qua MacTypes.h, nó tuyên bố #define nil NULL
jbat100

1
Điều đó rất thú vị. Có vẻ như nó không quan trọng hơn những điểm khác biệt. Nó giống như CÓ / THẬT và KHÔNG / SAI.
Brennan

1
@Brennan, Điều đó không hoàn toàn đúng, chỉ vì nil được định nghĩa là NULL không có nghĩa là có một số triển khai ẩn khác đằng sau hậu trường. Ví dụ, IBAction được định nghĩa là void nhưng nó có ý nghĩa khác khi sử dụng trình tạo giao diện khi hiển thị các phương thức để đính kèm với các hành động trên các nút và như vậy.
Micaiah Wallace

53

Về mặt kỹ thuật chúng giống nhau và chỉ khác nhau về kiểu dáng:

  • Kiểu Objective-C nói nillà sử dụng idkiểu gì (và con trỏ tới đối tượng).
  • Phong cách C nói rằng đó NULLlà những gì bạn sử dụng cho void *.
  • Phong cách C ++ thường nói rằng bạn chỉ nên sử dụng 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 .


14

NULLC 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.


4

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 *).


1
Đây không phải là khá nhiều lặp lại của câu trả lời hiện có ?
Pang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.