2009-02-17 30 views
176

Trong observeValueForKeyPath:ofObject:change:context: - tại sao tài liệu sử dụng NULL thay vì nil khi không chỉ định một con trỏ ngữ cảnh?NULL vs nil trong Mục tiêu-C

+0

theo ý kiến ​​của tôi, đối tượng là không, lớp là Nil và NULL sử dụng cho đối tượng hoặc lớp –

Trả lời

221

nil chỉ nên được sử dụng thay cho số id, những gì chúng tôi lập trình Java và C++ sẽ coi là con trỏ trỏ đến đối tượng. Sử dụng NULL cho con trỏ không đối tượng.

Nhìn vào tờ khai 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ỏ C-style), vì vậy bạn chắc chắn sẽ sử dụng NULL (mà đôi khi được khai báo là (void *)0) chứ không phải là nil (thuộc loại id).

+2

Nhưng vì kiểu 'context' trong' observValueForKeyPath: ofObject: change: context: 'là' void * ', điều đó không có nghĩa là dữ liệu được truyền như' context' có thể là một con trỏ đối tượng? Tôi nghĩ rằng đó là một trường hợp phổ biến. Đó là lý do tại sao tôi bị nhầm lẫn là tại sao các tài liệu luôn sử dụng 'NULL' thay cho' nil'. – erikprice

+2

Loại ngữ cảnh: trong phương thức đó là "void *". "nil" không phải là "void *", nhưng NULL là. –

+0

Vì vậy, có đúng là suy ra từ thảo luận này rằng chúng ta không thể truyền một con trỏ đối tượng (hay còn gọi là 'nil') khi chúng ta truyền thông điệp này đến đối tượng đang thực hiện NSKeyValueObserving? Bởi vì con trỏ đối tượng không thể có kiểu 'void *'? – erikprice

63

Chúng giống nhau về mặt kỹ thuật (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 với' nil'. 'nil' được định nghĩa là' (id) 0'. 'NULL' khô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 so với các điểm phong cách. Nó giống như YES/TRUE và NO/FALSE. – Brennan

50

Họ kỹ thuật điều tương tự và chỉ khác nhau về phong cách:

  • Objective-C phong cách nói nil là những gì để sử dụng cho các loại id (và con trỏ đến đối tượng).
  • Kiểu C cho biết NULL là những gì bạn sử dụng cho void *.
  • Kiểu C++ thường cho biết bạn chỉ nên sử dụng 0.

Tôi thường sử dụng biến thể khớp với ngôn ngữ mà loại đó là được khai báo.

+6

C++ 11 bây giờ sử dụng nullptr thay vì 0 cho con trỏ null –

10

NULLC equivalent của nil, con trỏ 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 thư tới NULL. Vì vậy, nó được ưa thích để sử dụng nil trong mục tiêu-C ở nhiều nơi.

3

Họ hầu hết là những điều tương tự ngoại trừ,

nil được sử dụng trong một phong cách Objective-C. trong đó NULL là dành cho con trỏ loại C và được đánh máy là (void *).

+1

Đây không phải là một sự lặp lại của [câu trả lời hiện tại] (http://stackoverflow.com/questions/557582/null-vs-nil-in- mục tiêu-c/557607 # 557607)? – Pang

Các vấn đề liên quan