Tôi đã có một số mã với một chu trình tham chiếu rõ ràng trong một khối ivar. Các mã sau đây gây ra một chu kỳ tài liệu tham khảo và dealloc không bao giờ được gọi là:__block chu trình tự tham chiếu trong khối ivar trong ARC
__block MyViewController *blockSelf = self;
loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockSelf.delegate loginDidFinish];
});
}
};
Tuy nhiên, nếu tôi có thể tạo một biến khác __block
để giữ một tham chiếu đến đại biểu của tôi cho phạm vi của khối để chụp, chu kỳ tài liệu tham khảo sẽ biến mất:
__block id <MyViewControllerDelegate> blockDelegate = self.delegate;
loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockDelegate loginDidFinish];
});
}
};
Chỉ muốn hiểu những gì đang xảy ra ở đây.
Perfect, cảm ơn! Tôi đã cập nhật tiêu đề câu hỏi của mình để mang tính mô tả hơn. –
Tôi đang nhắm mục tiêu iOS 4.3, vì vậy tôi đã phải sử dụng '' __unsafe_unretained'' để thay thế, nhưng nó hoạt động, cảm ơn! –