ในobserveValueForKeyPath:ofObject:change:context:- เหตุใดจึงใช้เอกสารNULLแทนnilเมื่อไม่ระบุตัวชี้บริบท
ในobserveValueForKeyPath:ofObject:change:context:- เหตุใดจึงใช้เอกสารNULLแทนnilเมื่อไม่ระบุตัวชี้บริบท
คำตอบ:
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)
contextin observeValueForKeyPath:ofObject:change:context:คือvoid *ไม่ได้หมายความว่าข้อมูลที่ผ่านเป็นcontextอาจเป็นตัวชี้วัตถุ? ฉันคิดว่าเป็นกรณีทั่วไป นั่นเป็นเหตุผลที่ฉันสับสนว่าทำไมเอกสารมักจะใช้แทนNULL nil
                    ในทางเทคนิคมันเป็นสิ่งเดียวกัน (0) แต่ไม่มีศูนย์มักจะใช้สำหรับประเภทวัตถุ Objective-C ในขณะที่ NULL จะใช้สำหรับพอยน์เตอร์แบบ c (void *)
ในทางเทคนิคแล้วสิ่งเดียวกันและมีสไตล์แตกต่างกันเท่านั้น:
nilเป็นสิ่งที่ใช้สำหรับidประเภท (และตัวชี้ไปยังวัตถุ)NULLvoid *0สไตล์มักจะบอกว่าคุณควรจะเป็นเพียงแค่การใช้งานฉันมักจะใช้ที่แตกต่างกันที่ตรงกับภาษาที่ประเภทที่มีการประกาศ
NULLเป็นC equivalentของnilตัวชี้ไปที่ไม่มีอะไร;
ที่nil is zero typed as id,
NULL is zero typed as void*. 
จุดสำคัญหนึ่งที่คุณไม่สามารถส่งข้อความถึง NULL ได้ ดังนั้นจึงควรใช้ศูนย์ในวัตถุประสงค์ -C ในหลาย ๆ ที่
พวกเขาเกือบจะเหมือนกันยกเว้น
nilถูกใช้ในสไตล์ Objective-C ที่NULLเป็นตัวชี้สำหรับ C ประเภทและ typdef'ed (void *)ไป