"nonatomic" หมายถึงอะไรในรหัสนี้
@property(nonatomic, retain) UITextField *theUsersName;
ความแตกต่างระหว่างอะตอมและ nonatomic คืออะไร?
ขอบคุณ
"nonatomic" หมายถึงอะไรในรหัสนี้
@property(nonatomic, retain) UITextField *theUsersName;
ความแตกต่างระหว่างอะตอมและ nonatomic คืออะไร?
ขอบคุณ
คำตอบ:
โดยทั่วไปถ้าคุณพูดnonatomic
และคุณสร้าง accessors โดยใช้@synthesize
ถ้าหลายกระทู้พยายามที่จะเปลี่ยน / อ่านคุณสมบัติพร้อมกันความเลวร้ายสามารถเกิดขึ้นได้ คุณสามารถรับค่าบางส่วนที่เขียนหรือวัตถุที่ปล่อยออกมา / เก็บเกินซึ่งสามารถนำไปสู่การล่มได้อย่างง่ายดาย (นี่อาจจะเร็วกว่าอุปกรณ์เสริมของอะตอมมาก)
หากคุณใช้ค่าเริ่มต้น (ซึ่งก็คือatomic
ไม่เคยมีคำหลักสำหรับสิ่งนี้ แต่มีอยู่ในขณะนี้ ) ดังนั้น@synthesize
เมธอด d ใช้การล็อกระดับวัตถุเพื่อให้แน่ใจว่าการอ่าน / เขียนไปยังคุณสมบัติเดียวหลายรายการจะต่อเนื่องกัน ตามที่เอกสารของ Apple ชี้ให้เห็นสิ่งนี้ไม่ได้หมายความว่าวัตถุทั้งหมดเป็นเธรดที่ปลอดภัยแต่คุณสมบัติการอ่าน / เขียนของแต่ละคุณสมบัตินั้น
แน่นอนถ้าคุณใช้อุปกรณ์เสริมของคุณเองมากกว่าการใช้ @synthesize
ฉันคิดว่าการประกาศเหล่านี้ไม่ได้ทำอะไรนอกจากแสดงความตั้งใจของคุณว่าทรัพย์สินถูกนำไปใช้ในลักษณะที่ปลอดภัยหรือไม่
atomic
หลีกเลี่ยงการขัดข้องในขณะที่เข้าถึงคุณสมบัติของแต่ละบุคคล แต่ไม่แน่ใจว่าวัตถุโดยรวม (เช่นการเข้าถึงคุณสมบัติที่แยกต่างหากเช่นชื่อและนามสกุล) จะทำอย่างไร สิ่งที่ถูกต้อง.
หลังจากอ่านบทความมากมายและโพสต์ StackOverflow และได้จัดทำแอพตัวอย่างเพื่อตรวจสอบคุณสมบัติของคุณสมบัติตัวแปรฉันจึงตัดสินใจรวบรวมข้อมูลคุณลักษณะทั้งหมดเข้าด้วยกัน
ดังนั้นด้านล่างนี้คือลิงก์บทความโดยละเอียดที่คุณสามารถค้นหาข้างต้นได้กล่าวถึงคุณสมบัติทั้งหมดซึ่งจะช่วยคุณได้อย่างแน่นอน ขอบคุณมากสำหรับทุกคนที่ให้คำตอบที่ดีที่สุดที่นี่ !!
ตัวอย่าง:
@property (retain) NSString *name;
@synthesize name;
ตัวอย่าง:
@property (nonatomic, retain) NSString *name;
@synthesize name;
นอกเหนือจากสิ่งที่ได้กล่าวไปแล้วเกี่ยวกับความปลอดภัยของเธรดแล้วคุณสมบัติที่ไม่ใช่อะตอมก็จะเร็วกว่าตัวเข้าถึงอะตอม ไม่ใช่สิ่งที่คุณมักจะต้องกังวล แต่เก็บไว้ในใจ คุณสมบัติหลักของข้อมูลที่สร้างขึ้นไม่ใช่เชิงอะตอมบางส่วนด้วยเหตุนี้
ในโปรแกรมแบบมัลติเธรดการดำเนินการแบบอะตอมมิกไม่สามารถถูกขัดจังหวะบางส่วนได้ในขณะที่การดำเนินการแบบไม่ใช่เชิงอะตอมสามารถทำได้
ดังนั้นคุณควรใช้ mutexes (หรือบางอย่างเช่นนั้น) หากคุณมีการดำเนินการที่สำคัญซึ่งไม่ใช่เชิงอะตอมที่คุณไม่ต้องการให้ถูกขัดจังหวะ
หากคุณระบุ "atomic" ฟังก์ชั่นการเข้าถึงที่สร้างขึ้นมีรหัสพิเศษบางอย่างเพื่อป้องกันการอัพเดทพร้อมกัน
โดยปกติแล้วอะตอมมิคหมายความว่าการเขียน / อ่านคุณสมบัติเกิดขึ้นเป็นการดำเนินการเดียว Atomic_operation
คุณสามารถรับข้อมูลเหล่านี้ได้โดยอ่านบทความด้านล่าง
เธรดอธิบายด้วยจุดประสงค์ของ nonatomic
nonatomic - ไม่ปลอดภัยสำหรับเธรด
atomic - Thread Safe - นี่คือคุณสมบัติเริ่มต้น
"อะตอม”หมายถึงว่าการเข้าถึงทรัพย์สินเป็นด้ายปลอดภัย. ในขณะที่'nonatomic'อยู่ตรงข้ามของมัน. เมื่อคุณประกาศคุณสมบัติใน Objective-C คุณสมบัติที่มีอะตอมโดยค่าเริ่มต้นเพื่อให้ accessors สังเคราะห์ให้การเข้าถึงที่แข็งแกร่งคุณสมบัติ ในสภาพแวดล้อมแบบมัลติเธรด - นั่นคือค่าที่ส่งคืนจาก getter หรือ set ผ่าน setter นั้นจะถูกดึงหรือตั้งค่าอย่างเต็มที่เสมอโดยไม่คำนึงถึงว่าเธรดอื่นใดที่กำลังดำเนินการพร้อมกัน แต่ถ้าคุณประกาศคุณสมบัติเป็น nonatomic เหมือนด้านล่าง
@property (nonatomic, retain) NSString *myString;
ดังนั้นมันหมายถึง accessor ที่ถูกสังเคราะห์สำหรับคุณสมบัติของวัตถุเพียงส่งคืนค่าโดยตรง ผลของแอ็ตทริบิวต์ที่ไม่ใช่เชิงอะตอมขึ้นอยู่กับสภาพแวดล้อม โดยค่าเริ่มต้น accessors สังเคราะห์เป็นอะตอม ดังนั้น nonatomic นั้นเร็วกว่าอะตอมมาก
หนึ่งคือสำหรับหลายกระทู้ หนึ่งไม่ได้