โปรดจำไว้ว่าการรักษาวัฏจักรอาจเกิดขึ้นได้หากบล็อกของคุณอ้างถึงวัตถุอื่นซึ่งยังคงอยู่selfอยู่
ฉันไม่แน่ใจว่าการรวบรวมขยะสามารถช่วยในการรักษารอบนี้ หากวัตถุรักษาบล็อก (ซึ่งฉันจะเรียกวัตถุเซิร์ฟเวอร์) outlives self(วัตถุลูกค้า) อ้างอิงถึงselfภายในบล็อกจะไม่ได้รับการพิจารณาวงจรทั้งหมดจนกว่าวัตถุรักษาตัวเองจะถูกปล่อยออกมา หากวัตถุเซิร์ฟเวอร์อยู่ไกลกว่าไคลเอนต์ของคุณคุณอาจมีหน่วยความจำรั่วไหลที่สำคัญ
เนื่องจากไม่มีวิธีแก้ปัญหาที่สะอาดฉันขอแนะนำวิธีแก้ปัญหาต่อไปนี้ โปรดเลือกอย่างน้อยหนึ่งรายการเพื่อแก้ไขปัญหาของคุณ
- ใช้การบล็อกเท่านั้นสำหรับการทำให้เสร็จสมบูรณ์และไม่ใช่สำหรับเหตุการณ์ปลายเปิด ตัวอย่างเช่นใช้บล็อกสำหรับวิธีการเช่น
doSomethingAndWhenDoneExecuteThisBlock:และไม่ใช่วิธีการที่ชอบsetNotificationHandlerBlock:และไม่ชอบวิธีการบล็อกที่ใช้เพื่อทำให้สำเร็จนั้นมีจุดสิ้นสุดที่แน่นอนและควรได้รับการปล่อยตัวโดยออบเจ็กต์เซิร์ฟเวอร์หลังจากได้รับการประเมิน สิ่งนี้จะช่วยป้องกันไม่ให้วงจรชีวิตนานเกินไปแม้ว่ามันจะเกิดขึ้น
- เต้นรำที่อ้างอิงอ่อน ๆ ที่คุณอธิบายไว้
- จัดเตรียมวิธีการล้างวัตถุของคุณก่อนที่จะวางจำหน่ายซึ่ง "ยกเลิกการเชื่อมต่อ" วัตถุจากวัตถุเซิร์ฟเวอร์ที่อาจเก็บการอ้างอิงไว้ และเรียกวิธีนี้ก่อนที่จะเรียกการปล่อยบนวัตถุ ในขณะที่วิธีนี้ใช้ได้อย่างสมบูรณ์ถ้าวัตถุของคุณมีลูกค้าเพียงคนเดียว (หรือเป็นคนเดียวในบริบท) แต่จะพังถ้ามันมีลูกค้าหลายราย คุณจะเอาชนะกลไกการนับที่นี่ได้ นี้จะคล้ายกับการเรียกร้องแทน
deallocrelease
หากคุณกำลังเขียนวัตถุเซิร์ฟเวอร์ให้ใช้การบล็อกอาร์กิวเมนต์เพื่อให้เสร็จสมบูรณ์เท่านั้น setEventHandlerBlock:ไม่ยอมรับข้อโต้แย้งบล็อกเรียกกลับเช่น กลับไปที่รูปแบบผู้แทนแบบดั้งเดิมแทน: สร้างโปรโตคอลอย่างเป็นทางการและโฆษณาsetEventDelegate:วิธี อย่ารักษาผู้รับมอบสิทธิ์ หากคุณไม่ต้องการสร้างโปรโตคอลที่เป็นทางการให้ยอมรับตัวเลือกเป็นผู้ติดต่อกลับ
และสุดท้ายรูปแบบนี้ควรส่งสัญญาณเตือน:
- (เป็นโมฆะ) dealloc {
[myServerObject releaseCallbackBlocksForObject: self];
...
}
หากคุณพยายามปลดบล็อกที่อาจอ้างถึงselfจากภายในแสดงdeallocว่าคุณมีปัญหาอยู่แล้ว deallocอาจไม่ถูกเรียกเนื่องจากรอบการเก็บข้อมูลที่เกิดจากการอ้างอิงในบล็อกซึ่งหมายความว่าวัตถุของคุณจะรั่วไหลจนกว่าวัตถุเซิร์ฟเวอร์จะถูกจัดสรรคืน
selfพร็อกซี่ของฉันthisเพียงเพื่อพลิกสิ่งต่าง ๆ ใน JavaScript ฉันเรียกการthisปิดของฉันselfดังนั้นจึงรู้สึกดีและสมดุล :)