Tôi có một phương pháp thỉnh thoảng gặp sự cố.Có phải "tự" yếu trong một phương thức trong ARC không?
-(void)foo{
[self doSomething];
[self.delegate didFinish];
[self doSomethingElse];
}
-doĐiều gì đó hoạt động chính xác, sau đó tôi gọi cho đại biểu -didFinish. Trong vòng -didFinish, tham chiếu đến đối tượng này có thể được đặt thành 0, phát hành nó dưới ARC. Khi phương thức bị treo, nó làm như vậy trên -doSomethingElse. Giả định của tôi là bản thân sẽ mạnh mẽ trong một phương pháp, cho phép hàm hoàn thành. Là tự yếu hay mạnh? Có tài liệu về điều này không? Điều gì sẽ là lý do cho nó được mạnh mẽ hay yếu?
Sửa
Sau khi được lấy cảm hứng từ một số các câu trả lời dưới đây, tôi đã làm một số điều tra. Nguyên nhân thực sự của vụ tai nạn trong trường hợp của tôi là NSNotificationCenter không giữ lại người quan sát trong mọi trường hợp. Mike Weller chỉ ra bên dưới rằng những người gọi phương thức nên giữ lại đối tượng trong khi nó đang được gọi để ngăn chặn trường hợp mà tôi đã mô tả ở trên, tuy nhiên có vẻ như NSNotificationCenter bỏ qua vấn đề này và luôn duy trì một tham chiếu yếu cho người quan sát. Nói cách khác:
-(void)setupNotification{
//observer is weakly referenced when added to NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNotification:)
name:SomeNotification object:nil];
}
//handle the notification
-(void)handleNotification:(id)notification{
//owner has reference so this is fine
[self doSomething];
//call back to the owner/delegate, owner sets reference to nil
[self.delegate didFinish];
//object has been dealloc'ed, crash
[self doSomethingElse];
}
Nếu nó là 'weak' sau đó 'self' nên trở thành' nil', và gửi tin nhắn cho' nil' sẽ không sụp đổ. Vì vậy, tôi sẽ đoán, không. – kennytm
Bạn đã sử dụng 'NSLog' để xem có gì với' self.delegate'? – Desdenova
Bạn nên đăng một số mã khác và theo dõi ngăn xếp của bạn, cũng bất kỳ ngoại lệ hoặc lỗi nào đang xảy ra. Đại biểu được tuyên bố như thế nào? –