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 self
myproperty
:
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
là __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.
Nguồn
2012-09-11 01:57:52
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. –
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?) –
@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. –