Tôi đã đọc qua tài liệu trên __block variables và suy nghĩ về các trường hợp tôi sử dụng __block. Đối với tôi, nó có vẻ như tôi cần nó trong hai trường hợp:Tại sao các biến __block không được giữ lại (Trong môi trường không phải ARC)?
- Để đánh dấu một biến như read-write khi được sử dụng trong một khối
- Để tránh giữ lại chu kỳ khi tham khảo tự trong một khối
Trên bề mặt nó không có vẻ như hai điều này có liên quan. Tôi xem xét thực tế là các biến __block không được giữ lại như một mẹo nhỏ mà tôi cần phải nhớ đối với trường hợp sử dụng cụ thể để tránh các chu kỳ giữ lại.
Tôi tự hỏi, có lý do quan trọng hơn về kiến trúc nào không phải vì sao chúng không được giữ lại? Tôi sẽ nghĩ rằng một số từ khóa khác để cho biết điều này có thể rõ ràng hơn, để không trộn lẫn hai tính năng được liệt kê ở trên.
cập nhật -
Tôi nên đề cập đến đây là mã không sử dụng ARC. Bây giờ tôi thấy rằng các biến __block trong thực tế được giữ lại trong ARC.
Bạn chỉ sử dụng '__block' cho mục đầu tiên. Bạn sử dụng '__weak', không phải' __block', để tránh các chu kỳ giữ lại. – rmaddy
Ngoài ra, bạn đã nhận được ý tưởng rằng các biến __block không được giữ lại ở đâu? ARC sẽ tự động giữ chúng cho bạn, giống như các biến thông thường. –
Trước ARC, các biến __block thực sự không được giữ lại như một cơ chế để tránh các chu kỳ giữ lại. Điều đó đã thay đổi với ARC và được ghi lại trong Ghi chú phát hành chuyển tiếp sang ARC. –