Mike Ash has written this introduction to ARC nơi ông giới thiệu một cái gì đó như:Khi nào và tại sao tôi muốn khai báo biến cục bộ dưới dạng __weak bằng ARC?
__weak Foo *_weakFoo = [object foo];
Tại sao tôi muốn làm điều đó cho một biến tạm thời địa phương? __weak là một tham chiếu zeroing sẽ tự động đặt con trỏ _weakFoo thành nil ngay khi đối tượng được tham chiếu bị deallocated. Ngoài ra, __weak chỉ có sẵn trong iOS> = 5.
Khi tôi chạy vào rắc rối khi tôi chỉ đơn giản là thực hiện điều này ?:
Foo *_weakFoo = [object foo];
này luôn được dự kiến sẽ trả về một đối tượng hoặc nil. Dự đoán của tôi là:
Foo *_weakFoo = [object foo];
[self doSomethingStupid]; // does something bad so foo gets deallocated
[_weakFoo doIt]; // CRASH! msg sent to deallocated instance 0x123456
Một điều vẫn còn lỗi với ARC là: Khi nào tôi biết rằng tôi không cần một đối tượng nữa? Tôi muốn lập luận rằng khi tôi đặt con trỏ thành nil hoặc một cái gì đó khác, nó chỉ ra rằng đối tượng được tham chiếu trước đây không cần thiết bởi chủ sở hữu này nữa và do đó có thể có thể biến mất. Nhưng vấn đề là: tôi đặt nó thành không. Vì vậy, nó là nil anyways!
Vì vậy, khi nào __weak cho một biến địa phương có ý nghĩa, và loại điều điên rồ nào tôi phải làm ở một nơi khác để tôi thực sự cần điều đó?
Làm thế nào có thể có chu kỳ lưu giữ? – openfrog
@openfrog - Khối đặc biệt này có thể không có nguy cơ lớn nhất là một chu kỳ giữ lại, nhưng một trong đó tôi đã chạy vào sẽ là các nhà quan sát dựa trên khối cho các thông báo (sử dụng '-addObserverForName của NSNotificationCenter's: queue: queue: usingBlock:'). Nếu bạn thiết lập một người quan sát như vậy trong một đối tượng, và tham khảo một cái gì đó trên 'self', bạn sẽ thiết lập một chu kỳ như đối tượng giữ trên khối và khối giữ trên đối tượng. –
Sau khi viết điều này, tôi nhận ra rằng đây không phải là ví dụ tốt nhất bởi vì dispatch_async() sao chép khối, nhưng chỉ cho đến khi kết thúc phương thức. Một ví dụ tốt hơn sẽ được sử dụng NSBlockOperation kể từ khi một thể hiện của sở hữu như vậy được truyền trong khối cho suốt đời của đối tượng, làm cho các chu trình giữ lại nhiều khả năng hơn. –