Objective-C ประกาศคุณสมบัติ @property (ไม่ใช่แบบเชิงสำเนาคัดลอกอ่อนแอ)


289

คนที่สามารถอธิบายให้ฉันในรายละเอียดเมื่อฉันต้องใช้แต่ละแอตทริบิวต์: nonatomic, copy, strong, weakและอื่น ๆ สำหรับสถานที่ให้บริการประกาศและอธิบายสิ่งที่แต่ละคนไม่? ตัวอย่างบางประเภทก็ยอดเยี่ยมเช่นกัน ฉันใช้ ARC


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

rypress.com/tutorials/objective-c/propertiesสิ่งนี้อธิบายมันทั้งหมด
Deepak Thakur

คำตอบ:


559

คำตอบนี้มีข้อผิดพลาดมากมายและล้าสมัยไปแล้ว โปรดดูคำถาม / คำตอบและความคิดเห็นอื่น ๆ


nonatomic

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

สำเนา

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

กำหนด

Assigncopyค่อนข้างตรงกันข้ามกับ เมื่อเรียกใช้ getter ของassignคุณสมบัติมันจะส่งคืนการอ้างอิงไปยังข้อมูลจริง โดยทั่วไปแล้วคุณใช้คุณลักษณะนี้เมื่อคุณมีคุณสมบัติประเภทดั้งเดิม (float, int, BOOL ... )

รักษา

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

แข็งแรง

strongเป็นการแทนที่สำหรับแอ็ตทริบิวต์การเก็บรักษาซึ่งเป็นส่วนหนึ่งของ Objective-C Automated Reference Counting (ARC) ในรหัสที่ไม่ใช่ ARC เป็นเพียงคำพ้องสำหรับเก็บ

เป็นเว็บไซต์ที่ดีในการเรียนรู้strongและweakสำหรับ iOS 5 http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

อ่อนแอ

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

ลิงค์ด้านบนมีทั้งข้อมูลที่ดีเกี่ยวกับความอ่อนแอและความแข็งแกร่ง


1
หากคุณกำลังใช้ NSString นี้ภายในตัวเองในชั้นเรียนมากกว่าที่คุณไม่จำเป็นต้องใช้คุณสมบัติคุณสามารถทำให้เป็น iVar และถ้าคุณใช้ในชั้นเรียนอื่นที่ฉันจะให้คำแนะนำ
Ankit Srivastava

1
คุณไม่มีคุณสมบัติ Assign
mskw

10
nonatomicหมายความว่าไม่ควรเข้าถึงหลายเธรดพร้อมกัน ค่าเริ่มต้นคือatomicสิ่งที่ทำให้เธรดปลอดภัย
wcochran

1
มันน่ารำคาญนิดหน่อยที่หลังจากนั้นตลอดเวลาความหมายของ nonatomic ยังคงผิดและคล้ายกับอะตอม ฉันสงสัยว่ามีกี่คนที่ใช้สิ่งนี้ในช่วงห้าปีที่ผ่านมาและได้รับความประทับใจที่ผิด สิ่งที่ @ wcochran พูดถูกต้อง nonatomic หมายถึงการเข้าถึงตัวชี้ไม่ได้จัดการแบบ atom และดังนั้นจึงไม่ปลอดภัยสำหรับเธรด ประโยชน์ที่ฉันเข้าใจว่าไม่ใช่เชิงอะตอมคือน้ำหนักเบา
John Bushnell

1
นอกจากความคิดเห็นของ @JohnBushnell แล้วยังมีข้อผิดพลาดอื่น ๆ อีกมากมายที่ไม่ถูกต้องในคำตอบนี้ มันยังไม่แก่ดีเช่นกันดังนั้นมันจึงเป็นประวัติศาสตร์ ไปดูที่อื่นถ้าคุณต้องการคำตอบสำหรับคำถามนี้
CRD

45

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

strongใช้กับ ARC และช่วยให้คุณโดยทั่วไปโดยไม่ต้องกังวลเกี่ยวกับจำนวนการเก็บรักษาของวัตถุ ARC จะเผยแพร่โดยอัตโนมัติเมื่อคุณทำเสร็จการใช้คำหลักstrongหมายความว่าคุณเป็นเจ้าของวัตถุ

weakความเป็นเจ้าของหมายความว่าคุณไม่ได้เป็นเจ้าของมันและเพียงแค่ติดตามวัตถุจนกระทั่งวัตถุที่ได้รับมอบหมายให้อยู่ทันทีที่วัตถุที่สองถูกปล่อยออกมาก็จะสูญเสียคุณค่า สำหรับเช่น obj.a=objectB;ถูกใช้และ a มีคุณสมบัติอ่อนกว่าค่าจะใช้ได้จนกว่า objectB จะยังคงอยู่ในหน่วยความจำ

copyสถานที่ให้บริการอธิบายได้ดีมากที่นี่

strong,weak,retain,copy,assignเป็นพิเศษร่วมกันดังนั้นคุณจึงไม่สามารถใช้พวกเขาบนวัตถุหนึ่งเดียว ... อ่าน"ประกาศ Properties"ส่วน

หวังว่าสิ่งนี้จะช่วยให้คุณออก ...


เหตุใดจึงอ่อนแออ่อนแอเก็บรักษาคัดลอกมอบหมายสิทธิ์พิเศษร่วมกัน
vinoth.kumar

nonatomicหมายถึงไม่มีการยกเว้นเท่านั้น ไม่ได้หมายความว่าการเข้าถึงไม่ปลอดภัยสำหรับเธรด นั่นคือรายละเอียดการนำไปใช้ที่atomicvs. nonatomicไม่ได้จับ
bbum

@bbum คุณสามารถอธิบายความแตกต่างระหว่างการยกเว้นและไม่ด้ายปลอดภัย .. ?
Ankit Srivastava

1
@AnkitSrivastava การแยกคือเมื่อเธรด A บล็อกเธรด B จากการลงเส้นทางรหัส หากเส้นทางรหัสนั้นปลอดภัยสำหรับการดำเนินการจากหลายเธรดดังนั้นจึงไม่จำเป็นต้องมีการยกเว้น ไม่ปลอดภัยเธรดหมายความว่าเส้นทางของรหัสอาจให้ผลลัพธ์ที่ไม่ได้กำหนดถ้า A และ B ลงไปพร้อมกัน นั่นคือการแยกออกสามารถนำมาใช้เพื่อสร้างสิ่งที่ปลอดภัยสำหรับเธรด แต่ความปลอดภัยของเธรดไม่ต้องการการดำเนินการที่เกิดขึ้นพร้อมกัน
bbum

17

ลิงค์นี้มีการทำลาย

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

มอบหมายหมายถึง __unsafe_unretained ความเป็นเจ้าของ

การทำสำเนาหมายถึงการเป็นเจ้าของ __ ที่แข็งแกร่งเช่นเดียวกับพฤติกรรมตามปกติของซีแมนทิกส์เกี่ยวกับการคัดลอกในสุนัข

รักษาความหมายเป็นเจ้าของ __ ที่แข็งแกร่ง

แข็งแกร่งหมายถึงการเป็นเจ้าของ __ ที่แข็งแกร่ง

unsafe_unretained implies __unsafe_unretained ความเป็นเจ้าของ

อ่อนแอหมายถึง __ อ่อนแอเป็นเจ้าของ


ไม่ใช่คุณสมบัติ Assign ที่ใช้สำหรับ iVar และค่าเท่านั้น เหตุใดจึงไม่ปลอดภัยและทำไมจึงจำเป็นต้องทราบว่าไม่ได้รับการตอบกลับ
mskw

9

คำตอบที่ดี! สิ่งหนึ่งที่ผมอยากจะชี้แจงลึก/nonatomic atomicผู้ใช้ควรเข้าใจว่าคุณสมบัตินี้ - "atomicity" แพร่กระจายเฉพาะในการอ้างอิงของแอตทริบิวต์และไม่ได้อยู่ในเนื้อหา Ie atomicจะรับประกันผู้ใช้งานแบบอะตอมมิกซิตี้สำหรับการอ่าน / การตั้งค่าตัวชี้และเฉพาะตัวชี้ไปยังแอตทริบิวต์ ตัวอย่างเช่น:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

ในกรณีนี้จะรับประกันได้ว่าตัวชี้ไปยังdictจะถูกอ่าน / ตั้งค่าในลักษณะอะตอมมิกโดยเธรดที่แตกต่างกัน แต่dictตัวมันเอง (พจนานุกรมdictชี้ไปที่) ยังคงเป็นเธรดที่ไม่ปลอดภัยนั่นคือการดำเนินการอ่าน / เพิ่มทั้งหมดในพจนานุกรมยังคงเป็นเธรดที่ไม่ปลอดภัย

หากคุณต้องการคอลเลกชันที่ปลอดภัยของเธรดคุณมีสถาปัตยกรรมที่ไม่ดี (บ่อยขึ้น) หรือความต้องการที่แท้จริง (หายาก) หากเป็น "ความต้องการที่แท้จริง" - คุณควรค้นหาส่วนประกอบคอลเลกชันเธรดที่ปลอดภัยและผ่านการทดสอบที่ดี & หรือเตรียมพร้อมสำหรับการทดลองและความยากลำบากที่เขียนด้วยตัวคุณเอง กรณีหลังดูที่ "ล็อคฟรี", "รอฟรี" กระบวนทัศน์ ดูเหมือนวิทยาศาสตร์จรวดในแวบแรก แต่สามารถช่วยให้คุณประสบความสำเร็จในการทำงานที่ยอดเยี่ยมเมื่อเทียบกับ "ล็อคปกติ"

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