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