ใน Objective-C คุณมีความแตกต่างระหว่างคุณสมบัติของอะตอมและคุณสมบัติที่ไม่ใช่อะตอม:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
จากความเข้าใจของฉันคุณสามารถอ่านและเขียนคุณสมบัติที่กำหนดเป็นอะตอมจากหลายเธรดได้อย่างปลอดภัยในขณะที่การเขียนและการเข้าถึงคุณสมบัติที่ไม่ใช่อะตอมหรือ ivars จากหลายเธรดในเวลาเดียวกันอาจทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดรวมถึงข้อผิดพลาดในการเข้าถึงที่ไม่ดี
ดังนั้นหากคุณมีตัวแปรเช่นนี้ใน Swift:
var object: NSObject
ฉันสามารถอ่านและเขียนถึงตัวแปรนี้แบบขนานอย่างปลอดภัยได้หรือไม่? (โดยไม่ได้คำนึงถึงความหมายที่แท้จริงของการทำเช่นนี้).
atomic
นี้โดยทั่วไปถือว่าไม่เพียงพอสำหรับการโต้ตอบกับเธรดเซฟตี้กับพร็อพเพอร์ตี้ยกเว้นประเภทข้อมูลธรรมดา สำหรับอ็อบเจ็กต์โดยทั่วไปแล้วอ็อบเจ็กต์หนึ่งจะซิงโครไนซ์การเข้าถึงข้ามเธรดโดยใช้การล็อก (เช่นNSLock
หรือ@synchronized
) หรือคิว GCD (เช่นคิวแบบอนุกรมหรือคิวพร้อมกันโดยใช้รูปแบบ "ตัวอ่าน - ตัวเขียน")
atomic
ไม่มั่นใจในความปลอดภัยของเธรดสำหรับวัตถุ และ (b) หากเราใช้เทคนิคการซิงโครไนซ์อย่างใดอย่างหนึ่งข้างต้นอย่างถูกต้องเพื่อให้แน่ใจว่าเธรดปลอดภัย (นอกเหนือจากสิ่งอื่น ๆ การป้องกันการอ่าน / เขียนพร้อมกัน) ปัญหาเกี่ยวกับอะตอมก็คือปัญหา แต่เรายังต้องการ / ต้องการสำหรับประเภทข้อมูลแบบธรรมดาที่atomic
มีมูลค่าจริง คำถามที่ดี!
@atomic
@nonatomic
หรือแค่ปรมาณูโดยปริยาย (Swift ยังไม่สมบูรณ์เราไม่สามารถบอกอะไรได้มากในตอนนี้)