NULL vs nil ใน Objective-C


182

ในobserveValueForKeyPath:ofObject:change:context:- เหตุใดจึงใช้เอกสารNULLแทนnilเมื่อไม่ระบุตัวชี้บริบท


ในความคิดของฉันวัตถุเป็นศูนย์ชั้นเป็นศูนย์และเป็นโมฆะใช้สำหรับวัตถุหรือชั้นเรียน
Thanh VũTrần

คำตอบ:


227

nilควรใช้แทนidสิ่งที่เรา Java และ C ++ โปรแกรมเมอร์จะคิดว่าเป็นตัวชี้ไปยังวัตถุ ใช้NULLสำหรับพอยน์เตอร์ที่ไม่ใช่วัตถุ

ดูประกาศของวิธีการที่:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
    change:(NSDictionary *)change context:(void *)context

บริบทคือvoid *(เช่นตัวชี้แบบ C) ดังนั้นคุณจะต้องใช้แน่นอนNULL(ซึ่งบางครั้งมีการประกาศเป็น(void *)0) แทนที่จะเป็นnil(ซึ่งเป็นประเภทid)


2
แต่เนื่องจากชนิดของcontextin observeValueForKeyPath:ofObject:change:context:คือvoid *ไม่ได้หมายความว่าข้อมูลที่ผ่านเป็นcontextอาจเป็นตัวชี้วัตถุ? ฉันคิดว่าเป็นกรณีทั่วไป นั่นเป็นเหตุผลที่ฉันสับสนว่าทำไมเอกสารมักจะใช้แทนNULL nil
erikprice

2
ประเภทของบริบท: ในวิธีนั้นคือ "void *" "ไม่มี" ไม่ใช่ "โมฆะ *" แต่ NULL คือ
Paul Tomblin

3
คุณสามารถ. เป็นโมฆะ * เป็นตัวชี้ใด ๆ อย่างไรก็ตามคุณพูดถูกว่า NULL เป็นค่าคงที่ที่ถูกต้อง
ปีเตอร์ Hosey

3
พวกเขาบอกว่าเป็นโมฆะ * NULL ใช้สำหรับโมฆะ * และไม่มีสำหรับ id ดังนั้นคุณผ่าน NULL หากคุณผ่านศูนย์คุณกำลังโกหกผู้อ่านของคุณซึ่งจะคิดว่าวิธีนี้ใช้รหัส
ปีเตอร์ Hosey

12
หรือคิดอีกวิธีหนึ่ง NULL เป็นชนิดที่กว้างกว่าและ nil เป็นส่วนย่อยของ NULL โดยทั่วไปให้ใช้ประเภทที่กว้างที่สุดที่คุณสามารถทำได้ (เช่นใน Java เขียนวิธีการของคุณเพื่อคาดหวังคอลเลกชันแทนที่จะเป็นเวกเตอร์เว้นแต่ว่าคุณต้องการบางสิ่งที่เฉพาะเจาะจงจากเวกเตอร์)
Paul Tomblin

65

ในทางเทคนิคมันเป็นสิ่งเดียวกัน (0) แต่ไม่มีศูนย์มักจะใช้สำหรับประเภทวัตถุ Objective-C ในขณะที่ NULL จะใช้สำหรับพอยน์เตอร์แบบ c (void *)


8
นอกจากนี้ยังมีการกำหนดที่แตกต่างกว่าNULL ถูกกำหนดให้เป็น ไม่ใช่ nilnil(id)0NULL

14
@WTP ถ้าคุณอ่านผ่าน MacTypes.h มันจะประกาศ #define nil NULL
jbat100

1
นั่นเป็นเรื่องที่น่าสนใจมาก ดูเหมือนว่าจะไม่สำคัญกว่าที่อื่นสำหรับคะแนนสไตล์ มันเหมือนกับ YES / TRUE และ NO / FALSE
เบรนแนน

1
@Brennan นั่นไม่จริงทั้งหมดเพียงเพราะไม่มีการกำหนดเป็น NULL ไม่ได้หมายความว่าจะมีการนำไปใช้ที่ซ่อนอยู่เบื้องหลัง ตัวอย่างเช่น IBAction ถูกกำหนดเป็นโมฆะ แต่มีความหมายที่แตกต่างกันเมื่อใช้ตัวสร้างส่วนต่อประสานเมื่อแสดงวิธีการแนบกับการกระทำบนปุ่มและอื่น ๆ
คายาวอลเลซ

53

ในทางเทคนิคแล้วสิ่งเดียวกันและมีสไตล์แตกต่างกันเท่านั้น:

  • สไตล์ Objective-C บอกว่าnilเป็นสิ่งที่ใช้สำหรับidประเภท (และตัวชี้ไปยังวัตถุ)
  • สไตล์ซีกล่าวว่าเป็นสิ่งที่คุณใช้สำหรับNULLvoid *
  • c ++ 0สไตล์มักจะบอกว่าคุณควรจะเป็นเพียงแค่การใช้งาน

ฉันมักจะใช้ที่แตกต่างกันที่ตรงกับภาษาที่ประเภทที่มีการประกาศ


14

NULLเป็นC equivalentของnilตัวชี้ไปที่ไม่มีอะไร;

ที่nil is zero typed as id,

NULL is zero typed as void*.

จุดสำคัญหนึ่งที่คุณไม่สามารถส่งข้อความถึง NULL ได้ ดังนั้นจึงควรใช้ศูนย์ในวัตถุประสงค์ -C ในหลาย ๆ ที่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.