สัญลักษณ์ @ แสดงอะไรในวัตถุประสงค์ -c


141

ฉันกำลังเรียนรู้ถึงวัตถุประสงค์ -c และยังคงชนกับสัญลักษณ์ @ มันถูกใช้ในสถานการณ์ต่าง ๆ ตัวอย่างเช่นตอนต้นของสตริงหรือวิธีการสังเคราะห์ accessor

สัญลักษณ์ @ หมายถึงอะไรในวัตถุประสงค์ -c


ทำไม @ ถูกใช้ก่อน @interface และ @end?
Lalit Kumar

คำตอบ:


159

@ตัวละครที่ไม่ได้ใช้ใน C หรือ C ++ ตัวระบุดังนั้นจึงใช้ในการแนะนำคำหลักภาษา Objective-C ในทางที่จะไม่ขัดแย้งกับคำภาษาอื่น ๆ สิ่งนี้ทำให้ส่วน "วัตถุประสงค์" ของภาษาสามารถผสมกับ C หรือ C ++ ได้อย่างอิสระ

ดังนั้นด้วยข้อยกเว้นน้อยมากเมื่อใดก็ตามที่คุณเห็น@ในโค้ด Objective-C บางอันคุณกำลังดูที่การสร้าง Objective-C แทนที่จะสร้าง C หรือ C ++

ข้อยกเว้นที่สำคัญid, Class, nilและNilซึ่งได้รับการรักษาโดยทั่วไปเป็นคำหลักภาษาถึงแม้ว่าพวกเขาอาจมีtypedefหรือ#defineอยู่เบื้องหลังพวกเขา ตัวอย่างเช่นคอมไพเลอร์จริง ๆ แล้วปฏิบัติidเป็นพิเศษในแง่ของกฎการแปลงประเภทตัวชี้ที่ใช้กับการประกาศเช่นเดียวกับการตัดสินใจว่าจะสร้างอุปสรรคการเขียน GC

ข้อยกเว้นอื่น ๆ ที่มีin, out, inout, oneway, byrefและbycopy; สิ่งเหล่านี้ถูกใช้เป็นหมายเหตุประกอบคลาสหน่วยเก็บข้อมูลเกี่ยวกับพารามิเตอร์ method และชนิดส่งคืนเพื่อให้ Distributed Objects มีประสิทธิภาพมากขึ้น (พวกเขากลายเป็นส่วนหนึ่งของลายเซ็นวิธีที่มีอยู่จากรันไทม์ที่ไม่สามารถดูเพื่อกำหนดวิธีการที่ดีที่สุดเป็นอันดับธุรกรรม.) นอกจากนี้ยังมีคุณลักษณะภายใน@propertyประกาศcopy, retain, assign, readonly, readwrite, nonatomic, getterและsetter; สิ่งเหล่านี้ใช้ได้ภายในส่วนของการ@propertyประกาศ


4
คุณช่วยอธิบายเกี่ยวกับสิ่งที่ @ (นิพจน์) ทำอะไรได้บ้าง เป็นรายการเดียวที่ฉันไม่เข้าใจในป๊อปอัพที่แสดงเมื่อฉันพิมพ์ @ ใน xcode
jchnxu

10
@ (99) เหมือนกับ [NSNumber numberWithInteger: 99] @ (YES) เหมือนกับ [NSNumber numberWithBool: YES] เครื่องหมาย @ เป็นทางลัดไปสู่การสร้างวัตถุ
JoJo

7
มีใครสับสนกับความจริงที่ว่า "คำตอบ" นี้ไม่ได้ตอบคำถามที่ระบุไว้จริง ๆ ? ผู้ถามบอกว่า "@ 'หมายความว่าอะไรใน Objective-C? และผู้ตอบตอบว่า "หมายความว่าคุณกำลังใช้ Objective-C" ฉันคิดว่าเขารู้มากแล้ว ...
Jon McClung

1
ประเภทของพล; จำเป็นต้องอยู่ในชุด ASCII พื้นฐานและยังไม่ได้ใช้โดย C เมื่อตัวประมวลผลล่วงหน้า Objective-C ตัวแรกถูกเขียนขึ้น @นั่นเป็นเหตุผลที่มันเป็น
Chris Hanson

1
Jon McClung: Leo ถูกต้องไม่มี "ความหมายที่ลึกซึ้งยิ่งขึ้น" @ตัวละครก็ไม่ได้ใช้โดย C ดังนั้นมันจึงเป็นความสะดวกสบาย“หลบหนีฟัก” เพื่อแยกทางเลือกที่ยังเก็บรักษาไว้เข้ากันได้ 100% ด้วยรหัส C ที่มีอยู่
คริสแฮนสัน

63

จากการสอน Objective-C: สัญลักษณ์ @เหตุผลที่อยู่ด้านหน้าคำหลักต่าง ๆ :

การใช้ @ ควรช่วยให้การคอมไพเลอร์ Objective-C ง่ายขึ้นในการคอมไพเลอร์ C ที่มีอยู่ เนื่องจาก @ ไม่ถูกต้องในบริบทใด ๆ ใน C ยกเว้นสตริงตัวอักษร tokenizer (ขั้นตอนแรกและเรียบง่ายในคอมไพเลอร์) จึงสามารถแก้ไขได้เพื่อค้นหาอักขระ @ นอกค่าคงที่สตริง (tokenizer เข้าใจสตริงตัวอักษร ดังนั้นจึงอยู่ในตำแหน่งที่จะแยกแยะความแตกต่างนี้) เมื่อพบ @ tokenizer จะทำให้ส่วนที่เหลือของคอมไพเลอร์ใน "โหมด Objective-C" (ตัวแยกวิเคราะห์ Objective-C จะรับผิดชอบในการคืนค่าคอมไพเลอร์กลับสู่โหมด C ปกติเมื่อตรวจพบจุดสิ้นสุดของรหัส Objective-C)

นอกจากนี้เมื่อเห็นหน้าสตริงตัวอักษรมันทำให้ NSString มากกว่า 'char *' ใน C


24

จากMacrumors: Objective-C Tutorialเมื่ออยู่ข้างหน้าตัวอักษร:

นอกจากนี้ยังมีตัวอักษร NSString ของ @ "" มันเป็นชวเลขเป็นหลักสำหรับวิธีการ + stringWithUTF8String ของ NSString

The @ ยังเพิ่มการสนับสนุน unicode ให้กับสตริง C


12
"มันเป็นชวเลขเป็นหลักสำหรับวิธี + stringWithUTF8String ของ NSString" ไม่อย่างนั้น สตริงถูกจัดสรรแบบสแตติกซึ่งทำให้แตกต่างจาก+[NSString stringWithUTF8String:](ถูกจัดสรรแบบไดนามิก) และการปล่อยและการเก็บรักษาจะไม่มีผลกับพวกเขา

16

จากคู่มือ :

โดยทั่วไปแล้ว Objective-C frameworks จะไม่ใช้สตริง C-style แต่จะส่งผ่านสตริงไปเป็นวัตถุ NSString แทน

คลาส NSString จัดเตรียม object wrapper สำหรับสตริงที่มีข้อดีทั้งหมดที่คุณคาดหวังรวมถึงการจัดการหน่วยความจำในตัวสำหรับการจัดเก็บสตริงความยาวโดยพลการสนับสนุน Unicode ยูทิลิตี้การจัดรูปแบบสไตล์การพิมพ์และอื่น ๆ เนื่องจากสตริงดังกล่าวมีการใช้งานทั่วไปแม้ว่า Objective-C จะมีสัญลักษณ์แบบย่อสำหรับการสร้างวัตถุ NSString จากค่าคงที่ ในการใช้ชวเลขนี้สิ่งที่คุณต้องทำคือนำหน้าสตริงปกติที่มีเครื่องหมายอัญประกาศคู่ที่มีสัญลักษณ์ @ ดังแสดงในตัวอย่างต่อไปนี้:

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];

3
แต่นี่เป็นเพียงตัวอย่างหนึ่งของการ@ใช้งาน ฉันกำลังดูโค้ดดังนี้: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... ไม่มีอะไรเกี่ยวข้องกับ NSString
GreenAsJade
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.