คุณสมบัติ“ Nonatomic” หมายถึงอะไร


144

"nonatomic" หมายถึงอะไรในรหัสนี้

@property(nonatomic, retain) UITextField *theUsersName;

ความแตกต่างระหว่างอะตอมและ nonatomic คืออะไร?

ขอบคุณ


3
ขออภัยลืมระบุใน Objective-c (cocoa)

โปรดอ่านลิงค์นี้ - stackoverflow.com/questions/588866/…
Vijayendra

สำหรับทุกคนที่อ่านสิ่งนี้ในปี 2014 สิ่งสำคัญคือการตระหนักถึงข้อมูลจำนวนมากล้าสมัย ไม่มีเหตุผลใดเลยที่จะใช้ nonatomic และมันก็ผิดที่จะใช้มันไม่ว่าจะด้วยเหตุผลใดก็ตาม มันเป็นประวัติศาสตร์โบราณ Nonatomic หมายถึง "โหมดไม่ปลอดภัยของเธรด" และ (ในคำ) นั้นไม่เกี่ยวข้องทั้งหมด ความคิดเห็นบางส่วนที่นี่stackoverflow.com/q/23977765/294884
Fattie

ฉันไม่เห็นด้วยกับคำสั่ง "ไม่เกี่ยวข้อง" หากค่ามีการเปลี่ยนแปลงน้อยและเป็นตัวอย่างใน Apple doc เป็นนามสกุล มันเปลี่ยนครั้งเดียวแล้วใช้คำใบ้อะตอมเสียทรัพยากรที่เกี่ยวข้องเนื่องจากไม่จำเป็นต้องตรวจสอบ
Nick Turner

นี่คือคำตอบstackoverflow.com/a/32942413/1961064
Grigori Jlavyan

คำตอบ:


268

ลองดูที่ที่แอปเปิ้ลเอกสาร

โดยทั่วไปถ้าคุณพูดnonatomicและคุณสร้าง accessors โดยใช้@synthesizeถ้าหลายกระทู้พยายามที่จะเปลี่ยน / อ่านคุณสมบัติพร้อมกันความเลวร้ายสามารถเกิดขึ้นได้ คุณสามารถรับค่าบางส่วนที่เขียนหรือวัตถุที่ปล่อยออกมา / เก็บเกินซึ่งสามารถนำไปสู่การล่มได้อย่างง่ายดาย (นี่อาจจะเร็วกว่าอุปกรณ์เสริมของอะตอมมาก)

หากคุณใช้ค่าเริ่มต้น (ซึ่งก็คือatomicไม่เคยมีคำหลักสำหรับสิ่งนี้ แต่มีอยู่ในขณะนี้ ) ดังนั้น@synthesizeเมธอด d ใช้การล็อกระดับวัตถุเพื่อให้แน่ใจว่าการอ่าน / เขียนไปยังคุณสมบัติเดียวหลายรายการจะต่อเนื่องกัน ตามที่เอกสารของ Apple ชี้ให้เห็นสิ่งนี้ไม่ได้หมายความว่าวัตถุทั้งหมดเป็นเธรดที่ปลอดภัยแต่คุณสมบัติการอ่าน / เขียนของแต่ละคุณสมบัตินั้น

แน่นอนถ้าคุณใช้อุปกรณ์เสริมของคุณเองมากกว่าการใช้ @synthesizeฉันคิดว่าการประกาศเหล่านี้ไม่ได้ทำอะไรนอกจากแสดงความตั้งใจของคุณว่าทรัพย์สินถูกนำไปใช้ในลักษณะที่ปลอดภัยหรือไม่


7
ฉันชอบคำตอบนี้ - สับสนน้อยลงง่ายขึ้นและสมบูรณ์กว่าที่พบในที่อื่น!
PapillonUK

เป็นเรื่องที่ยอดเยี่ยมมากและสับสนน้อยกว่า (+1) แต่คุณช่วยบอกได้ไหมว่าเพราะเหตุใดการไม่ปรมาณูจึงอาจเร็วกว่าตัวเข้าถึงอะตอม
หวังว่า

2
@Wish non-atomic accessors สามารถทำได้เร็วกว่าเนื่องจากการป้องกันเธรดอื่นไม่ให้อ่าน / เขียนในเวลาเดียวกันคุณต้องถือ mutex หรือทำเล่ห์เหลี่ยมอื่นในระดับต่ำซึ่งใช้เวลา CPU หากคุณกำลังใช้การล็อกคุณสามารถสิ้นสุดการบล็อกในเธรดอื่นซึ่งต้องใช้เวลาเช่นกัน
Jesse Rusak

1
@Rob คุณอาจต้องการถามคำถามใหม่เกี่ยวกับเรื่องนี้
Jesse Rusak

1
@Pratik ขออภัยนั่นไม่ถูกต้อง คำพูดที่คุณแสดงนั้นเหมือนกับสิ่งที่ฉันทำ: การทำให้คุณสมบัติatomicหลีกเลี่ยงการขัดข้องในขณะที่เข้าถึงคุณสมบัติของแต่ละบุคคล แต่ไม่แน่ใจว่าวัตถุโดยรวม (เช่นการเข้าถึงคุณสมบัติที่แยกต่างหากเช่นชื่อและนามสกุล) จะทำอย่างไร สิ่งที่ถูกต้อง.
Jesse Rusak

46

หลังจากอ่านบทความมากมายและโพสต์ StackOverflow และได้จัดทำแอพตัวอย่างเพื่อตรวจสอบคุณสมบัติของคุณสมบัติตัวแปรฉันจึงตัดสินใจรวบรวมข้อมูลคุณลักษณะทั้งหมดเข้าด้วยกัน

  1. อะตอม // ค่าเริ่มต้น
  2. nonatomic
  3. strong = รักษา // เริ่มต้น
  4. weak = unsafe_unretained
  5. รักษา
  6. กำหนด // เริ่มต้น
  7. unsafe_unretained
  8. สำเนา
  9. อ่านเท่านั้น
  10. readwrite // ค่าเริ่มต้น

ดังนั้นด้านล่างนี้คือลิงก์บทความโดยละเอียดที่คุณสามารถค้นหาข้างต้นได้กล่าวถึงคุณสมบัติทั้งหมดซึ่งจะช่วยคุณได้อย่างแน่นอน ขอบคุณมากสำหรับทุกคนที่ให้คำตอบที่ดีที่สุดที่นี่ !!

คุณสมบัติของตัวแปรหรือตัวดัดแปลงใน iOS

  1. อะตอม
    • อะตอมมิกหมายถึงเพียงเธรดเดียวที่เข้าถึงตัวแปร
    • อะตอมเป็นเธรดที่ปลอดภัย
    • แต่ประสิทธิภาพก็ช้า
    • อะตอมเป็นพฤติกรรมเริ่มต้น
    • ตัวเข้าถึงอะตอมมิกในสภาพแวดล้อมที่ไม่ได้เก็บขยะ (เช่นเมื่อใช้การเก็บรักษา / ปล่อย / การเลิกอัตโนมัติ) จะใช้การล็อกเพื่อให้แน่ใจว่าเธรดอื่นไม่รบกวนการตั้งค่า / การรับค่าที่ถูกต้อง
    • ไม่ใช่คำหลักจริงๆ

ตัวอย่าง:

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic
    • Nonatomic หมายถึงหลายเธรดเข้าถึงตัวแปร (ชนิดไดนามิก)
    • Nonatomic เป็นเธรดที่ไม่ปลอดภัย
    • แต่ประสิทธิภาพก็เร็ว
    • Nonatomic ไม่ใช่พฤติกรรมเริ่มต้น เราจำเป็นต้องเพิ่มคำหลักที่ไม่ใช่เชิงอะตอมในคุณสมบัติของคุณสมบัติ
    • มันอาจส่งผลให้พฤติกรรมที่ไม่คาดคิดเมื่อกระบวนการ (กระทู้) ที่แตกต่างกันสองเข้าถึงตัวแปรเดียวกันในเวลาเดียวกัน

ตัวอย่าง:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

นอกเหนือจากสิ่งที่ได้กล่าวไปแล้วเกี่ยวกับความปลอดภัยของเธรดแล้วคุณสมบัติที่ไม่ใช่อะตอมก็จะเร็วกว่าตัวเข้าถึงอะตอม ไม่ใช่สิ่งที่คุณมักจะต้องกังวล แต่เก็บไว้ในใจ คุณสมบัติหลักของข้อมูลที่สร้างขึ้นไม่ใช่เชิงอะตอมบางส่วนด้วยเหตุนี้


9

ในโปรแกรมแบบมัลติเธรดการดำเนินการแบบอะตอมมิกไม่สามารถถูกขัดจังหวะบางส่วนได้ในขณะที่การดำเนินการแบบไม่ใช่เชิงอะตอมสามารถทำได้

ดังนั้นคุณควรใช้ mutexes (หรือบางอย่างเช่นนั้น) หากคุณมีการดำเนินการที่สำคัญซึ่งไม่ใช่เชิงอะตอมที่คุณไม่ต้องการให้ถูกขัดจังหวะ


8

หากคุณระบุ "atomic" ฟังก์ชั่นการเข้าถึงที่สร้างขึ้นมีรหัสพิเศษบางอย่างเพื่อป้องกันการอัพเดทพร้อมกัน


6

โดยปกติแล้วอะตอมมิคหมายความว่าการเขียน / อ่านคุณสมบัติเกิดขึ้นเป็นการดำเนินการเดียว Atomic_operation


2

คุณสามารถรับข้อมูลเหล่านี้ได้โดยอ่านบทความด้านล่าง

เธรดอธิบายด้วยจุดประสงค์ของ nonatomic

nonatomic - ไม่ปลอดภัยสำหรับเธรด

atomic - Thread Safe - นี่คือคุณสมบัติเริ่มต้น


1
คุณแน่ใจหรือว่าไม่ใช่สิ่งที่ตรงกันข้าม คุณสมบัติของอะตอมมีความปลอดภัย แต่คุณสมบัติที่ไม่ใช่ของอะตอมจะไม่ปลอดภัย ครั้งล่าสุดที่ฉันตรวจสอบมันเป็นเช่นนั้น: P
David Rönnqvist

0

"อะตอม”หมายถึงว่าการเข้าถึงทรัพย์สินเป็นด้ายปลอดภัย. ในขณะที่'nonatomic'อยู่ตรงข้ามของมัน. เมื่อคุณประกาศคุณสมบัติใน Objective-C คุณสมบัติที่มีอะตอมโดยค่าเริ่มต้นเพื่อให้ accessors สังเคราะห์ให้การเข้าถึงที่แข็งแกร่งคุณสมบัติ ในสภาพแวดล้อมแบบมัลติเธรด - นั่นคือค่าที่ส่งคืนจาก getter หรือ set ผ่าน setter นั้นจะถูกดึงหรือตั้งค่าอย่างเต็มที่เสมอโดยไม่คำนึงถึงว่าเธรดอื่นใดที่กำลังดำเนินการพร้อมกัน แต่ถ้าคุณประกาศคุณสมบัติเป็น nonatomic เหมือนด้านล่าง

@property (nonatomic, retain)  NSString *myString;

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


-2

หนึ่งคือสำหรับหลายกระทู้ หนึ่งไม่ได้


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