ОК, оказалось хорошим взаимодействием между блоками и этим фрагментом кода, перечисленным выше.
Для контекста, наша библиотека использовалась внешней стороной таким образом, который мы бы не рекомендовали.
Вот что произошло вокруг:
XXXMadsAdViewController *adViewController = [[[XXXMadsAdViewController alloc]init]autorelease];
self.adViewController = adViewController;
[self.adViewController loadAdWithCompletionHandler:^(BOOL success) {
//stuff
}];
XXXMadsAdViewController оба расширили MadsAdViewController , поскольку он был делегатом для получения вызова метода didReceivePartialAd
. [self.delegate didReceivePartialAd]
вызывается в методе didReceiveResponse
, который я не включил в исходный вопрос, и который назывался до [self logEvent];
Теперь иногда self.adViewController
уже был освобожден, но этот блок все еще ждал обратного вызова. При обратном вызове didReceivePartialAd
блок был обработан, self.adViewController
снова выпущен и приложение упало.
Я исправил проблему, сделав didReceivePartialAd
последним оператором метода didReceiveResponse
.
Спасибо, ребята, без ваших указателей я бы все еще думал, что это было условие гонки!