Having a problem with zombies in UISearchDisplayController

I have zombies using a UISearchDisplayController with a UITableView.

UISearchDisplayController (and the rest of the view) is installed through the interface builder (storyboard on xcode 5 and only using ARC and iOS 7).

The DisplayController search function is used by these two methods.

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self filterContentForSearchText:searchString scope: [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; return YES; } -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { [self filterContentForSearchText:self.searchDisplayController.searchBar.text scope: [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]]; return YES; } 

Tools give me this information.

 # Event TypeRefCt RefCt Timestamp Responsible Library Responsible Caller 0 Malloc +1 1 00:10.739.188 UIKit -[UITableView setTableHeaderBackgroundColor:] 1 Retain +1 2 00:10.739.214 UIKit -[UIView(Internal) _addSubview:positioned:relativeTo:] 2 Retain +1 3 00:10.739.234 UIKit -[UISearchDisplayController _configureSearchBarForTableView] 3 Retain +1 4 00:10.739.291 UIKit -[UIView(Hierarchy) subviews] 4 Retain +1 5 00:10.771.238 UIKit -[UIView(Hierarchy) subviews] 5 Retain +1 6 00:10.782.890 QuartzCore -[CALayer layoutSublayers] 6 Release -1 5 00:10.782.891 QuartzCore -[CALayer layoutSublayers] 7 Release -1 4 00:10.792.538 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) 8 Release -1 3 00:15.446.447 UIKit -[UITableView dealloc] 9 Release -1 2 00:15.446.661 UIKit -[UIView(Internal) _invalidateSubviewCache] 10 Release -1 1 00:15.446.679 UIKit -[UIView(Hierarchy) removeFromSuperview] 11 Release -1 0 00:15.446.744 UIKit -[UITableView setTableHeaderBackgroundColor:] 12 Zombie -1 00:15.446.765 UIKit -[UISearchDisplayController _cleanUpSearchBar] 

I tried to clear the UISearchDisplayController in a dealloc method like this

 -(void)dealloc { self.searchDisplayController.searchResultsTableView.delegate = nil; self.searchDisplayController.delegate = nil; self.searchDisplayController.searchBar.delegate = nil; self.searchDisplayController.searchResultsDelegate = nil; self.searchDisplayController.searchResultsDataSource = nil; } 

but it didn’t work.

Do you have any idea what I'm doing wrong?

Thanks for the help.

+7
automatic-ref-counting storyboard nszombie uisearchdisplaycontroller
source share
3 answers

I think I managed to solve this problem. Here's another question regarding workarounds:

UISearchDisplayController crashes after viewDidUnload

So I added:

 @property (nonatomic, weak) IBOutlet UISearchBar *searchBar; @property (nonatomic) UISearchDisplayController *searchController; 

And then in viewDidLoad:

 UISearchDisplayController *searchController = [[UISearchDisplayController alloc] initWithSearchBar:[self searchBar] contentsController:self]; [searchController setDelegate:self]; [searchController setSearchResultsDelegate:self]; [searchController setSearchResultsDataSource:self]; [self setSearchController:searchController]; 

And in dealloc:

 [self setSearchController:nil]; 

It seems to have decided.

+11
source share

Perhaps a known issue regarding searchDisplayController is not persisting. Try this to increase your retention count:

in .h:

 @property (nonatomic, strong) UISearchDisplayController *searchController; 

in viewDidLoad:

 self.searchController = (__bridge UISearchDisplayController *)(CFBridgingRetain(self.searchDisplayController)); 

in dealloc (not sure if necessary):

 self.searchController = CFBridgingRelease((__bridge void*)(self.searchController)); 
+1
source share
 - (void) viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; self.tableView = nil; } 
+1
source share

All Articles