ทั้งสองweak
และunowned
การอ้างอิงไม่สร้างการstrong
พักไว้บนออบเจ็กต์อ้างอิง (aka พวกเขาจะไม่เพิ่มจำนวนการเก็บรักษาเพื่อป้องกัน ARC จากการยกเลิกการจัดสรรคืนออบเจ็กต์อ้างอิง)
แต่ทำไมสองคำค้นหา ความแตกต่างนี้เกี่ยวข้องกับความจริงที่ว่าOptional
ประเภทนั้นมีอยู่ในภาษาสวิฟท์ เรื่องราวสั้น ๆ เกี่ยวกับพวกเขา: ประเภทที่เป็นตัวเลือกมีความปลอดภัยของหน่วยความจำ (ซึ่งทำงานได้อย่างสวยงามกับกฎตัวสร้างของ Swift - ซึ่งเข้มงวดเพื่อให้ได้รับประโยชน์นี้)
การweak
อ้างอิงอนุญาตให้มีความเป็นไปได้ที่จะnil
เกิดขึ้น (สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติเมื่อวัตถุที่ถูกอ้างอิงถูกจัดสรรคืน) ดังนั้นประเภทของทรัพย์สินของคุณจะต้องเป็นทางเลือก - ดังนั้นคุณในฐานะโปรแกรมเมอร์จะต้องตรวจสอบก่อนที่จะใช้ คอมไพเลอร์บังคับให้คุณเขียนโค้ดที่ปลอดภัยที่สุดเท่าที่จะทำได้)
การunowned
อ้างอิงสันนิษฐานว่ามันจะไม่กลายเป็นnil
ช่วงชีวิตของมัน การอ้างอิงที่ไม่ได้เป็นเจ้าของจะต้องตั้งค่าในระหว่างการเริ่มต้น - ซึ่งหมายความว่าการอ้างอิงจะถูกกำหนดเป็นประเภทที่ไม่จำเป็นซึ่งสามารถใช้งานได้อย่างปลอดภัยโดยไม่มีการตรวจสอบ หากมีการยกเลิกการจัดสรรวัตถุอย่างใดแอพจะหยุดทำงานเมื่อมีการใช้การอ้างอิงที่ไม่ได้เป็นเจ้าของ
จากเอกสาร Apple :
ใช้การอ้างอิงที่อ่อนแอเมื่อใดก็ตามที่ถูกต้องสำหรับการอ้างอิงนั้นที่จะกลายเป็นศูนย์ ณ จุดใดช่วงหนึ่งในช่วงชีวิตของมัน ในทางกลับกันให้ใช้การอ้างอิงที่ไม่ได้เป็นเจ้าของเมื่อคุณรู้ว่าการอ้างอิงนั้นจะไม่เป็นศูนย์เมื่อมีการตั้งค่าในระหว่างการเริ่มต้น
ในเอกสารมีบางตัวอย่างที่หารือเกี่ยวกับการรักษารอบและวิธีการทำลายพวกเขา ตัวอย่างทั้งหมดเหล่านี้จะสกัดจากเอกสาร
ตัวอย่างของweak
คำหลัก:
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
}
class Apartment {
let number: Int
init(number: Int) { self.number = number }
weak var tenant: Person?
}
และตอนนี้สำหรับศิลปะ ASCII บางอัน (คุณควรไปดูเอกสาร - พวกเขามีไดอะแกรมสวย ๆ ):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
Person
และApartment
ตัวอย่างที่แสดงให้เห็นว่าสถานการณ์ที่สองคุณสมบัติทั้งสองที่ได้รับอนุญาตให้เป็นศูนย์ที่มีศักยภาพที่จะทำให้เกิดวงจรการอ้างอิงที่แข็งแกร่ง สถานการณ์นี้ได้รับการแก้ไขที่ดีที่สุดด้วยการอ้างอิงที่อ่อนแอ ทั้งสองเอนทิตีสามารถดำรงอยู่ได้โดยปราศจากการพึ่งพาซึ่งกันและกัน
ตัวอย่างของunowned
คำหลัก:
class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}
ในตัวอย่างนี้Customer
อาจจะหรืออาจไม่ได้มีCreditCard
แต่CreditCard
มักจะCustomer
เชื่อมโยงกับ เพื่อเป็นตัวแทนนี้Customer
ชั้นจะมีตัวเลือกcard
สถานที่ให้บริการ แต่CreditCard
ชั้นมีไม่เลือก (และไม่มีเจ้าของ) customer
สถานที่ให้บริการ
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Customer
และCreditCard
ตัวอย่างที่แสดงให้เห็นว่าสถานการณ์ที่หนึ่งสถานที่ให้บริการที่ได้รับอนุญาตให้เป็นศูนย์และทรัพย์สินที่ไม่สามารถเป็นศูนย์อื่นมีศักยภาพที่จะก่อให้เกิดวงจรการอ้างอิงที่แข็งแกร่ง สถานการณ์นี้ได้รับการแก้ไขที่ดีที่สุดด้วยการอ้างอิงที่ไม่ได้เป็นเจ้าของ
หมายเหตุจาก Apple:
การอ้างอิงที่อ่อนแอจะต้องประกาศเป็นตัวแปรเพื่อระบุว่าค่าของพวกเขาสามารถเปลี่ยนแปลงได้ในขณะทำงาน การอ้างอิงที่อ่อนแอไม่สามารถประกาศเป็นค่าคงที่ได้
นอกจากนี้ยังมีสถานการณ์ที่สามเมื่อคุณสมบัติทั้งสองควรมีค่าอยู่เสมอและไม่ควรมีคุณสมบัติใดเป็นศูนย์เมื่อการกำหนดค่าเริ่มต้นเสร็จสมบูรณ์
และยังมีสถานการณ์การเก็บรักษาแบบคลาสสิกเพื่อหลีกเลี่ยงเมื่อทำงานกับการปิด
สำหรับวันนี้ผมขอแนะนำให้ท่านไปที่เอกสารแอปเปิ้ลหรืออ่านหนังสือ