Wie kann die automatische Freigabe von UISearchDisplayController einen Absturz in einem anderen Ansichtscontroller verursachen?

Ich habe zwei View-Controller A und B. Von A aus navigiere ich zum View-Controller B wie folgt:

// 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

}

In BViewController wird die Eigenschaft bPropery1 mit copy wie folgt definiert (Hinweis, B enthält auch UITableView und andere Eigenschaften):

@property (nonatomic, copy) NSString *bProperty1;

Alles schien gut zu funktionieren, wenn ich zwischen A und B hin und her navigierte. Bis ich der in BViewController enthaltenen Tabellenansicht einen UISearchDisplayController hinzufügte. Wenn ich nun von B zurück zu A navigiere, stürzt die App ab.

Stack Trace zeigt an, wie der Search Display Controller zum Zeitpunkt des Absturzes automatisch freigegeben wird:

#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 zeigt:

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

Und die Malloc-Historie in diesem Punkt verweist auf den bViewController, der bereits in A's navigateToB-Methode oben veröffentlicht wurde:

    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 

Kann mir bitte jemand eine Idee geben, was hier passiert? In der navigateToB-Methode sollte dies für bViewController gelten, sobald der bViewController (nach pushViewController) freigegeben wurde. Nichts anderes weiß davon, da es lokal für den navigateToB-Methodenblock ist und freigegeben wurde.

Wenn Sie von B zurück nach A navigieren, wird in viewDidLoad, viewWillAppear usw. nichts aufgerufen, das navigateToB erneut eingibt.

Es sieht so aus, als ob der Search Display Controller einen Verweis auf etwas in meinem AViewController hat. Wenn er automatisch freigegeben wird, nimmt er dieses "Etwas" herunter, aber ich kann nicht verstehen, wie dies möglich ist, insbesondere, weil ich für die Übergabe eine Kopie verwende Daten zwischen A und B.

Ich werde darüber töpfchen. Ich bin mir sicher, dass dies irgendwo mein Fehler ist, und deshalb wende ich mich an Sie, Stack Overflow-Legenden, um Worte der Weisheit oder Ratschläge zur Lösung dieses Problems zu erhalten.

Danke vielmals

Antworten auf die Frage(6)

Ihre Antwort auf die Frage