2012-09-11 40 views
5

Tôi đang gặp một chút khó khăn khi đưa đầu xung quanh tham chiếu tự trong một khối và không tạo chu kỳ giữ lại.các khối, tự, giữ lại chu kỳ

Bạn có thể cho tôi biết nếu hiểu biết của tôi là chính xác:

Nếu tôi đã từng tham khảo tự trong một khối, nó sẽ tạo ra một chu kỳ giữ lại, và thay vào đó tôi nên tạo ra một tài liệu tham khảo yếu để tự bên ngoài của khối và sau đó sử dụng tham chiếu yếu đó bên trong khối?

Cảm ơn!

Trả lời

11

Vâng, đó là chính xác, với một vài trường hợp ngoại lệ:

Một duy trì chu kỳ chỉ xảy ra nếu self kết thúc duy trì khối gián tiếp, ví dụ thiết lập thuộc tính myblock về sở hữu của selfmyproperty:

self.myproperty.myblock = ^{ [self dosomething]; }; // ERROR: Retain Cycle 

Tuy nhiên, một giữ lại chu kỳ không (thường) xảy ra khi sử dụng khối cho một cái gì đó như mã công văn, như thế này:

dispatch_async(dispatch_get_main_queue(), ^{ [self dosomething]; }); // Safe, dispatch_async will not be retained by you 

Trừ khi tất nhiên bạn gọi hàm dispatch_async bên trong một khối có tiêu chí là chu trình giữ lại.

Điều này thực sự khó hiểu và đó là điều tôi hy vọng được khắc phục. Bây giờ, cho ý kiến ​​của riêng tôi:


Nó không phải luôn luôn như vậy, trong pre-ARC mã này không phải là một vấn đề, nhưng kể từ khi khối bây giờ tự động giữ lại bất kỳ đối tượng họ nắm bắt, nó là một vấn đề.

Tôi muốn điều này sẽ được khắc phục, vì nó sẽ là một sửa chữa khá dễ dàng, bằng cách có loại self__weak instancetype const thay vì instancetype const. Nó cũng sẽ giải quyết một số vấn đề với việc tạo các cụm lớp trong ARC, mà phải thừa nhận không phải là vấn đề lớn nhất, nhưng nó vẫn tồn tại.

Theo như lợi thế để giữ lại chu kỳ, không có nhiều.

+1

Chu kỳ lưu giữ không phải là lỗi nghiêm trọng - chủ sở hữu Khối có thể xử lý Khối đó trước khi phá hủy, phá vỡ chu trình và tránh bất kỳ sự cố nào. –

+0

Có an toàn để chỉ tạo ra một tham chiếu yếu đến bản thân và luôn luôn sử dụng tham chiếu yếu đó bên trong khối, chỉ để đảm bảo không có chu trình giữ lại? (Giả sử tôi ok với khả năng rằng khi khối thực hiện, selfWeak có thể là một con trỏ nil?) –

+0

@WiseShepherd tất nhiên, đó là cách bạn sửa chữa các chu kỳ giữ lại, trong hầu hết các tình huống. –

Các vấn đề liên quan