Unless you have overridden initWithNibName:bundle: in ViewController2 to do something truly unfortunate, there's extremely little chance that what you're saying can be true.
If you alter your code with this following assertion, does the assertion really trigger?
UINavigationController* navigationController = self.navigationController;
ViewController2 *childView = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
NSAssert(navigationController == self.navigationController, @"I was removed from the navigation controller!");
[self.navigationController pushViewController:childView animated:YES];