Como o autorelease de UISearchDisplayController pode causar falha em um controlador de exibição diferente?

Eu tenho dois controladores de exibição A e B. Em A, navego para exibir o controlador B da seguinte maneira:

// in View Controller A 
// navigateToB method

-(void) navigateToB {

BViewController *bViewController = 
[[BViewController alloc] initWithNibName: @"BView" bundle:nil];

bViewController.bProperty1 = SOME_STRING_CONSTANT;
bViewController.title = @"A TITLE OF A VC's CHOOSING"; 
[self.navigationController pushViewController: bViewController animated:YES];
[bViewController release]; //<----- releasing 0x406c1e0

}

No BViewController, a propriedade bPropery1 é definida com cópia conforme abaixo (observe que B também contém UITableView e outras propriedades):

@property (nonatomic, copy) NSString *bProperty1;

Tudo parecia funcionar bem ao navegar entre A e B. Isso foi até eu adicionar um UISearchDisplayController à exibição de tabela contida no BViewController. Agora, quando saio de B, de volta para A, o aplicativo falha.

O rastreamento de pilha mostra o que parece o controlador de exibição de pesquisa sendo liberado automaticamente no momento do travamento:

#0 0x009663a7 in ___forwarding___
#1 0x009426c2 in __forwarding_prep_0___
#2 0x018c8539 in -[UISearchDisplayController _destroyManagedTableView]
#3 0x018c8ea4 in -[UISearchDisplayController dealloc]
#4 0x00285ce5 in NSPopAutoreleasePool

NSZombies mostra:

-[BViewController respondsToSelector:]: message sent to deallocated instance 0x406c1e0

E a história do malloc nesse ponto aponta para o bViewController já lançado no método navigateToB de A acima:

    Call [2] [arg=132]: thread_a065e720 |start  ... <snip> 
..._sendActionsForEvents:withEvent:] | -[UIControl sendAction:to:forEvent:] | -
[UIApplication sendAction:to:from:forEvent:] | -[**AViewController navigateToB**] | 
+[NSObject alloc] | +[NSObject allocWithZone:] | _internal_class_createInstance | 
_internal_class_createInstanceFromZone | calloc | malloc_zone_calloc 

Alguém pode me dar alguma idéia do que está acontecendo aqui? No método navigateToB, uma vez liberado o bViewController (após pushViewController), deve ser o caso do bViewController. Nada mais sabe sobre ele, pois é local para o bloco do método navigateToB e foi lançado.

Ao navegar de B de volta a A, nada é chamado em viewDidLoad, viewWillAppear etc. que retornará a navegarToTo.

Parece que, de alguma forma, o controlador de exibição de pesquisa tem uma referência a algo no meu AViewController e, como é liberado automaticamente, está retirando esse "algo", mas não consigo entender como isso é possível, especialmente porque estou usando a cópia para passar dados entre A e B.

Eu estou indo mal com isso. Tenho certeza de que esse é o meu erro em algum lugar e, por isso, recorro a você, lenda do Stack Overflow, por quaisquer palavras de sabedoria ou conselhos sobre como resolver isso.

Muito Obrigado.

questionAnswers(3)

yourAnswerToTheQuestion