Chắc chắn. Nó thực sự không phải là tất cả những gì không phổ biến, mặc dù bạn có thể không nhận ra nó. Ví dụ, giả sử rằng bộ điều khiển của tôi đang thực hiện yêu cầu mạng và tôi thực sự cần đảm bảo tôi xử lý phản hồi, ngay cả khi người dùng đã điều hướng khỏi bộ điều khiển đó.
tôi có thể làm điều gì đó như thế này:
- (void)doNetworkThing {
__block MyController *blockSelf = self;
NSURLRequest *request = // some request
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error) {
// Handle the response here
[blockSelf doThingWithResponse:response];
}];
}
này giới thiệu một tầm thường duy trì chu kỳ nơi self
đã gây ra bản thân để được giữ lại bằng cách gán cho bản thân để con trỏ mạnh blockSelf
. Cho đến khi blockSelf
vượt quá phạm vi, bản thân sẽ không bị hủy bỏ.
Lưu ý rằng thông thường, bạn sẽ sử dụng một con trỏ yếu trong tình huống này. Nhưng nếu bạn thực sự cần bộ điều khiển để xung quanh để xử lý nó, bằng cách sử dụng một con trỏ mạnh mẽ hoạt động quá. Ngay sau khi xử lý khối được deallocated, tham chiếu của nó để blockSelf
sẽ biến mất. Kể từ khi các tài liệu tham khảo ngăn xếp để blockSelf
cũng đi tự sau đó sẽ được deallocated nếu không ai khác đang nắm giữ vào nó.
Vì vậy, về cơ bản, blockSelf
gây ra một chu kỳ lưu giữ tạm thời, rất hữu ích trong việc đảm bảo rằng deallocation không thể xảy ra cho đến khi yêu cầu hoàn tất. Vì ARC tự động dọn sạch số lượng lưu giữ khi biến __block vượt quá phạm vi, nó không giống như một chu trình giữ lại. Nhưng tuy nhiên, đó là những gì nó được.
Nguồn
2013-05-02 17:30:56
Không phải là giải pháp tốt hơn để giữ một tham chiếu mạnh mẽ bằng cách sử dụng một ivar hoặc biến thích hợp khác? – rmaddy
Kiến thức phổ biến sẽ nói có. Nhưng đó là lý do tại sao tôi hỏi câu hỏi.Có lẽ có một trường hợp tạo ra một chu kỳ giữ lại (chẳng hạn như một nơi mà một đối tượng giữ lại chính nó) là giải pháp tốt nhất. – MikeS
Đây là câu hỏi khó trả lời vì nó quá mở. Các câu hỏi với "bao giờ" hoặc "không bao giờ" và "tốt nhất" không thể được trả lời tốt. Sẽ tốt hơn nếu bạn có một trường hợp sử dụng cụ thể để hỏi. – rmaddy