И если это действительно поддерживает вас, так как вы чередуете только два просмотра, вам на самом деле не нужен весь этот текущий / следующий бизнес. Ну, вы можете отслеживать ток, если хотите ... но вот идея.
Если у вас есть свойства:
@property (nonatomic, strong) UIViewController *controller1;
@property (nonatomic, strong) UIViewController *controller2;
@property (nonatomic, weak) UIViewController *currentController;
Тогда вы можете иметь метод:
- (id)swapControllers {
// use the current controller to figure out what the next controller is, so
// you don't have to do the two way swap. do in the completion, if you like.
UIViewController *nextController = ([self.currentController isEqual:self.controller1]) ? self.controller1 : self.controller2;
[UIView animateWithDuration:.25
animations:^{
// TODO: some animations on currentController and nextController
} completion:^(BOOL finished) {
[self.currentController wasMovedOffScreen];
self.currentController = nextController;
}];
}
Что касается вашей первоначальной проблемы, ARC хорошо знает, как обрабатывать блоки - если вы ее не используете, я могу спросить, не забыли ли вы скопировать блок, объявленный в другом месте, затем сохраненный, а затем переданный в качестве завершения обработчик. Так как это не так, и так как вы не смогли получить репродукцию ... Я предполагаю, что вы, возможно, используете бета-версию SDK - в последнее время в бета-версиях были некоторые ошибки ARC. Если это так, вы можете попробовать собрать с последним стабильным выпуском и посмотреть, получите ли вы лучшие результаты.