ในแอพ iPad เล็ก ๆ ของฉันฉันมีฟังก์ชั่น "เปลี่ยนภาษา" ที่ใช้ผู้สังเกตการณ์ viewDidLoad:
ทุกควบคุมดูลงทะเบียนตัวเองกับผู้สังเกตการณ์ของฉันในช่วงของ
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
เมื่อผู้ใช้กดปุ่ม "เปลี่ยนภาษา" ภาษาใหม่จะถูกเก็บไว้ในรูปแบบของฉันและผู้สังเกตการณ์จะได้รับแจ้งและเรียกupdateUi:
ตัวเลือกบนวัตถุที่ลงทะเบียน
สิ่งนี้ทำงานได้ดีมากยกเว้นเมื่อฉันมีตัวควบคุมมุมมองใน TabBarController นี่คือเนื่องจากเมื่อแถบแท็บโหลดมันดึงไอคอนแท็บจากตัวควบคุมลูกโดยไม่ต้องเริ่มต้นมุมมองดังนั้นจึงviewDidLoad:
ไม่ถูกเรียกดังนั้นตัวควบคุมมุมมองเหล่านั้นไม่ได้รับการแจ้งเตือนการเปลี่ยนแปลงภาษา ด้วยเหตุนี้ฉันจึงย้ายการregisterObject:
โทรไปยังinit
วิธีการ
ย้อนกลับไปเมื่อฉันเคยviewDidLoad:
ลงทะเบียนกับผู้สังเกตการณ์ฉันเคยviewDidUnload:
ยกเลิกการลงทะเบียน ตั้งแต่ตอนนี้ผมลงทะเบียนในก็จะทำให้ความรู้สึกมากที่จะถอนการลงทะเบียนในinit
dealloc
แต่นี่คือปัญหาของฉัน เมื่อฉันเขียน:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
ฉันได้รับข้อผิดพลาดนี้:
ARC ห้ามส่งข้อความที่ชัดเจนถึง 'dealloc'
เนื่องจากฉันต้องโทรหา[super dealloc]
เพื่อให้แน่ใจว่าซูเปอร์คลาสนั้นสะอาดอย่างถูกต้อง แต่ ARC ห้ามไม่ให้ฉันติดอยู่ตอนนี้ มีวิธีอื่นที่จะได้รับแจ้งเมื่อวัตถุของฉันใกล้จะตายหรือไม่