ปัญหาที่เกี่ยวข้องกับหน่วยความจำหลักที่คุณจะต้องทราบก็คือการรักษารอบ สิ่งนี้เกิดขึ้นเมื่อวัตถุหนึ่งมีตัวชี้ที่แข็งแกร่งไปยังวัตถุอื่น แต่วัตถุเป้าหมายนั้นมีตัวชี้ที่แข็งแกร่งกลับไปเป็นต้นฉบับ แม้ว่าการอ้างอิงอื่น ๆ ทั้งหมดไปยังวัตถุเหล่านี้จะถูกลบทิ้ง แต่การอ้างอิงเหล่านั้นจะยังคงค้างอยู่ซึ่งกันและกันและจะไม่ถูกเปิดเผย สิ่งนี้สามารถเกิดขึ้นได้ทางอ้อมด้วยโซ่ของวัตถุที่อาจมีห่วงโซ่สุดท้ายที่อ้างอิงกลับไปยังวัตถุก่อนหน้า
ด้วยเหตุนี้จึงทำให้มีคุณสมบัติ__unsafe_unretained
และ__weak
ความเป็นเจ้าของอยู่ อดีตจะไม่เก็บวัตถุใด ๆ ที่ชี้ไป แต่จะเปิดโอกาสให้วัตถุนั้นหายไปและชี้ไปยังหน่วยความจำที่ไม่ดีในขณะที่วัตถุหลังไม่เก็บวัตถุและตั้งค่าตัวเองเป็นศูนย์โดยอัตโนมัติเมื่อเป้าหมายถูกจัดสรรคืน __weak
โดยทั่วไปแล้วทั้งสองเป็นที่ต้องการบนแพลตฟอร์มที่รองรับ
คุณจะใช้ตัวระบุเหล่านี้สำหรับสิ่งต่าง ๆ เช่นตัวแทนซึ่งคุณไม่ต้องการให้วัตถุเก็บรักษาตัวแทนและอาจนำไปสู่รอบ
คู่ของความกังวลที่เกี่ยวข้องกับหน่วยความจำที่สำคัญอีกประการหนึ่งที่มีการจัดการของมูลนิธิหลักวัตถุและจัดสรรหน่วยความจำโดยใช้ชนิดเช่นmalloc()
char*
ARC ไม่ได้จัดการประเภทเหล่านี้เฉพาะวัตถุ Objective-C ดังนั้นคุณจะต้องจัดการกับพวกเขาด้วยตัวเอง ประเภทของมูลนิธิแกนกลางอาจมีความซับซ้อนโดยเฉพาะอย่างยิ่งเพราะบางครั้งพวกเขาจำเป็นต้องเชื่อมโยงกับวัตถุ Objective-C ที่ตรงกันและในทางกลับกัน ซึ่งหมายความว่าจำเป็นต้องมีการควบคุมการถ่ายโอนกลับไปกลับมาจาก ARC เมื่อทำการเชื่อมต่อระหว่างชนิด CF และ Objective-C มีการเพิ่มคำหลักบางคำที่เกี่ยวข้องกับการเชื่อมโยงนี้และ Mike Ash มีคำอธิบายที่ดีเกี่ยวกับการเชื่อมโยงกรณีต่างๆในการเขียน ARC ที่มีความยาวมาก
นอกจากนี้ยังมีอีกหลายกรณีที่พบน้อยกว่า แต่ก็ยังมีปัญหาที่อาจเกิดขึ้นได้ซึ่งรายละเอียดที่ตีพิมพ์ระบุในรายละเอียด
พฤติกรรมใหม่ ๆ ส่วนใหญ่ซึ่งมีพื้นฐานอยู่บนการรักษาวัตถุรอบตัวตราบใดที่มีตัวชี้ที่ชัดเจนพวกมันก็คล้ายกับการรวบรวมขยะบน Mac อย่างไรก็ตามการสนับสนุนทางเทคนิคนั้นแตกต่างกันมาก รูปแบบของการจัดการหน่วยความจำนี้อาศัยกฎการรักษา / ปล่อยที่เข้มงวดซึ่งเราทุกคนต้องปฏิบัติตามใน Objective-C
ARC ใช้งานการจัดการหน่วยความจำแบบซ้ำ ๆ ที่เราต้องทำมาหลายปีและถ่ายมันไปยังคอมไพเลอร์ดังนั้นเราจึงไม่ต้องกังวลกับมันอีก วิธีนี้คุณไม่มีปัญหาการหยุดชะงักหรือโปรไฟล์หน่วยความจำฟันเลื่อยที่พบบนแพลตฟอร์มที่เก็บขยะ ฉันเคยเจอทั้งสองอย่างนี้ในแอปพลิเคชั่น Mac ที่รวบรวมขยะและฉันอยากเห็นว่าพวกเขาทำงานอย่างไรภายใต้ ARC
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรวบรวมขยะกับ ARC ให้ดูการตอบสนองที่น่าสนใจนี้โดย Chris Lattner ในรายชื่อผู้รับจดหมายของ Objective-Cซึ่งเขาแสดงข้อดีของ ARC มากกว่าการรวบรวมขยะ Objective-C 2.0 ฉันพบปัญหา GC หลายเรื่องที่เขาอธิบาย