Это может быть поздно, но у меня была та же проблема. Я проверил с NSLog, и метод dealloc не вызывался на дочерние контроллеры.
В моем случае у меня есть родительский контроллер, имеющий дочерний контроллер, но этот родитель также является дочерним для другого супер родительского контроллера.
Итак, мое решение заключается в реализации willMoveToParentViewController и удалении там ребенка.
Но в моем случае я назвал этот метод, потому что этот родитель является дочерним элементом другого родительского контроллера.
// removing the parent from super parent controller
[_parentViewController willMoveToParentViewController:nil];
[_parentViewController removeFromParentViewController];
[_parentViewController.view removeFromSuperview];
_parentViewController = nil;
Я не знаю о вашем случае, хотя, но, надеюсь, это поможет другим, которые могли бы иметь такую же проблему со мной.