I think I've been able to work around this problem. Here's another question talks about workarounds:
UISearchDisplayController causes crash 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];
That seems to have solved it.