ใน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
)
context
in observeValueForKeyPath:ofObject:change:context:
คือvoid *
ไม่ได้หมายความว่าข้อมูลที่ผ่านเป็นcontext
อาจเป็นตัวชี้วัตถุ? ฉันคิดว่าเป็นกรณีทั่วไป นั่นเป็นเหตุผลที่ฉันสับสนว่าทำไมเอกสารมักจะใช้แทนNULL
nil
ในทางเทคนิคมันเป็นสิ่งเดียวกัน (0) แต่ไม่มีศูนย์มักจะใช้สำหรับประเภทวัตถุ Objective-C ในขณะที่ NULL จะใช้สำหรับพอยน์เตอร์แบบ c (void *)
ในทางเทคนิคแล้วสิ่งเดียวกันและมีสไตล์แตกต่างกันเท่านั้น:
nil
เป็นสิ่งที่ใช้สำหรับid
ประเภท (และตัวชี้ไปยังวัตถุ)NULL
void *
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 *)
ไป