ความหมายของ id คืออะไร?


98

ฉัน (พยายาม) เรียนรู้ Objective-C และฉันก็เจอวลีเช่น:

-(id) init;

และฉันเข้าใจว่าidเป็นคำหลักของภาษา C แบบ Objective แต่การพูดว่า "คอมไพเลอร์ปฏิบัติidตามกฎการแปลงประเภทตัวชี้โดยเฉพาะ" หมายความว่าอย่างไร

ไม่idกำหนดวัตถุโดยอัตโนมัติไปทางขวาของมันเป็นตัวชี้?


28
มันตรงกันข้ามกับอาตมา สำหรับบางคนนั่นคือvoid*
Hot Licks

นี่คือการอภิปรายที่เกี่ยวข้องกับคำถาม: คำถาม SO
dmitri

คำตอบ:


123

idเป็นตัวชี้ไปยังประเภทใด ๆ แต่ต่างจากที่void *ชี้ไปที่วัตถุ Objective-C เสมอ ตัวอย่างเช่นคุณสามารถเพิ่มอะไรประเภทidไปยัง NSArray แต่วัตถุเหล่านั้นต้องตอบสนองต่อและretainrelease

คอมไพเลอร์ยินดีเป็นอย่างยิ่งสำหรับคุณในการส่งวัตถุใด ๆ โดยปริยายidและให้คุณส่งidไปยังวัตถุใด ๆ ซึ่งแตกต่างจากการหล่อโดยนัยอื่น ๆ ใน Objective-C และเป็นพื้นฐานสำหรับคอนเทนเนอร์ส่วนใหญ่ใน Cocoa


11
Supplement: id คำจำกัดความคือtypedef struct objc_object *id;ดังนั้นจึงชี้ไปที่Objcวัตถุ
zhongwuzw

มันเหมือนกับNSObject? หมายความว่าฉันสามารถแทนที่idด้วยNSObjectเมื่อเป็นประเภทส่งคืนได้หรือไม่?
ThunderWiring


33

idเป็นตัวชี้ไปยังวัตถุ Objective-C ( objc_object) ไม่ใช่แค่ตัวชี้โมฆะและคุณไม่ควรปฏิบัติเช่นนั้น อ้างอิงถึงวัตถุที่ควรมีisaตัวชี้ที่ถูกต้อง ค่าที่สามารถเก็บไว้ในidนี้ยังไม่ได้ จำกัด อยู่เพียงเพื่อNSObjectและลูกหลานของมันซึ่งเริ่มที่จะให้ความรู้สึกของการดำรงอยู่ของNSObjectโปรโตคอลเช่นเดียวกับระดับที่ไม่ได้รับมรดกแม้จะมาจากNSProxy NSObjectคอมไพเลอร์จะอนุญาตให้คุณกำหนดอ็อบเจ็กต์ที่อ้างอิงตามประเภทidให้กับอ็อบเจ็กต์ประเภทใดก็ได้กำหนดอ็อบเจ็กต์ประเภทใดก็ได้idรวมทั้งส่งข้อความ (ที่คอมไพเลอร์เห็น) โดยไม่มีการเตือน


25

idเป็นประเภททั่วไป ซึ่งหมายความว่าคอมไพลเลอร์จะคาดหวังวัตถุประเภทใดก็ได้ที่ นั่นและจะไม่บังคับใช้ข้อ จำกัด จะมีประโยชน์หากคุณคาดว่าจะใช้วัตถุมากกว่าหนึ่งคลาสที่นั่น จากนั้นคุณสามารถใช้วิปัสสนาเพื่อค้นหาว่ามันคือคลาสใด จะถือว่าตัวชี้โดยอัตโนมัติเนื่องจากวัตถุทั้งหมดใน Objective-C จะถูกส่งผ่านเป็นตัวชี้ / การอ้างอิงid

แหล่งข้อมูลเพิ่มเติมบางส่วน:
id vs NSObject vs id *
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing


9
  • idคือชนิดข้อมูลของตัวระบุอ็อบเจ็กต์ใน Objective-C ซึ่งสามารถใช้กับอ็อบเจ็กต์ประเภทใดก็ได้ไม่ว่าคลาสนั้นจะมีคลาสใดก็ตาม idคือซูเปอร์ประเภทสุดท้ายของออบเจ็กต์ทั้งหมด

ใน java หรือ c # เราใช้แบบนี้

 Object data = someValue;


 String name =(Object)data;

แต่ในวัตถุประสงค์ค

id data= someValue;



NSString *name= data;

5

ใช่และไม่. เป็นเรื่องจริงที่id xกำหนดให้ x เป็นตัวชี้ แต่การบอกว่ากฎการแปลงประเภทตัวชี้ใช้นั้นไม่ถูกต้องเนื่องจาก "id" มีกฎการแปลงประเภทพิเศษ ตัวอย่างเช่นด้วยvoid *ตัวชี้คุณไม่สามารถทำได้:

void *x;
char *y = x; // error, this needs an explicit cast

ในทางตรงกันข้ามเป็นไปได้ด้วย id:

id x;
NSString *y = x;

ดูการใช้รหัสประเภทเพิ่มเติมในตัวอย่างวัตถุประสงค์ cรหัสในตัวอย่างควัตถุประสงค์

นอกจากนี้ใน Objective C "สมัยใหม่" ยังแนะนำให้ใช้instancetypeแทน "id" ในวิธีการ "init" แม้จะมีเครื่องมือแปลงอัตโนมัติใน Xcode สำหรับเปลี่ยนสิ่งนั้น อ่านเกี่ยวกับ instancetype: การเริ่มใช้ instancetype แทน id จะเป็นประโยชน์หรือไม่

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