Mam kod z wyraźnym cyklem odniesienia w bloku ivar. Poniższy kod powoduje cyklu odniesienia i dealloc nigdy nie nazywa się:__blokuj własny cykl odniesienia w bloku ivar w 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];
});
}
};
Jednakże, jeśli tworzę innej zmiennej __block
posiadać odniesienie do mojego delegata do zakresu stosowania bloku do przechwytywania, cykl odniesienia odchodzi:
__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];
});
}
};
Chcę tylko zrozumieć, co się tutaj dzieje.
Perfect, dzięki! Zaktualizowałem tytuł mojego pytania, by był bardziej opisowy. –
Jestem kierowany na system iOS 4.3, więc zamiast tego użyłem '' __unsafe_unretained'', ale działa, dziękuję! –