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.