Trong ứng dụng iPad nhỏ của tôi, tôi có chức năng "chuyển đổi ngôn ngữ" sử dụng trình quan sát. Mỗi trình điều khiển xem đăng ký chính nó với người quan sát của tôi trong thời gian đó viewDidLoad:
.
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Khi người dùng nhấn nút "thay đổi ngôn ngữ", ngôn ngữ mới được lưu trữ trong mô hình của tôi và người quan sát được thông báo và gọi một updateUi:
bộ chọn trên các đối tượng đã đăng ký.
Điều này hoạt động rất tốt, ngoại trừ khi tôi có các bộ điều khiển xem trong TabBarControll. Điều này là do khi thanh tab tải, nó tìm nạp các biểu tượng tab từ các bộ điều khiển con của nó mà không khởi tạo các khung nhìn, vì vậy viewDidLoad:
không được gọi, vì vậy các bộ điều khiển xem đó không nhận được thông báo thay đổi ngôn ngữ. Vì điều này, tôi đã chuyển registerObject:
các cuộc gọi của mình vào init
phương thức.
Quay lại khi tôi đã từng viewDidLoad:
đăng ký với người quan sát của mình, tôi đã từng viewDidUnload:
hủy đăng ký. Vì tôi hiện đang đăng ký init
, rất có ý nghĩa để hủy đăng ký dealloc
.
Nhưng đây là vấn đề của tôi. Khi tôi viết:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
Tôi nhận được lỗi này:
ARC cấm gửi tin nhắn rõ ràng của 'dealloc'
Vì tôi cần gọi [super dealloc]
để đảm bảo các siêu lớp được dọn sạch đúng cách, nhưng ARC cấm điều đó, giờ tôi bị kẹt. Có cách nào khác để được thông báo khi đối tượng của tôi sắp chết không?