7

UITableViewでUISearchDisplayControllerを使用しているときにゾンビがあります。UISearchDisplayControllerでゾンビ問題が発生しました

UISearchDisplayController(およびその他のビュー)は、インターフェイスビルダー(xcode 5のストーリーボード、ARCおよびiOS 7のみを使用)を介して設定されます。

searchDisplayControllerは、私はこの

-(void)dealloc { 
    self.searchDisplayController.searchResultsTableView.delegate = nil; 
    self.searchDisplayController.delegate = nil; 
    self.searchDisplayController.searchBar.delegate = nil; 
    self.searchDisplayController.searchResultsDelegate = nil; 
    self.searchDisplayController.searchResultsDataSource = nil; 
} 
ようにdeallocメソッドでUISearchDisplayControllerをクリーンアップしようとした

# Event Type ∆ RefCt 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] 

インスツルメンツは私にこの情報を与えている

-(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; 
} 

これらの2つの方法で使用されています

でも動作しませんでした。

私が間違っていることを知っていますか?

ありがとうございました。

答えて

11

私は私はこの問題を回避することができたと思います。だから、

UISearchDisplayController causes crash after viewDidUnload

私が追加:ここでは回避策に関する別の質問の会談をだのviewDidLoadで

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

そして:

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

とのdeallocでそれはそれを解決したようだ。

+0

ありがとう、それは完璧に動作しますが、私は理由を理解していないと告白します。この問題の解決方法を教えてください。再度ありがとう:) – Bou

+0

私はあなたが何を意味知っています。私はなぜそれが自分の作品を理解していない。このようなiOS 7の回避策が積み重なっています。 – BenRB

+0

同じです...回避策は動作しますが、この問題の原因を理解したいと思います。 – GxocT

1

おそらく、searchDisplayControllerに関連する既知の問題が保持されていない可能性があります。 .hの中

:のviewDidLoadで

@property (nonatomic, strong) UISearchDisplayController *searchController; 

:deallocを中

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

(必要な場合はわからない):保持カウントをインクリメントするために、これを試してみてください

self.searchController = CFBridgingRelease((__bridge void*)(self.searchController)); 
+0

私は特別なリリースを行っていますが、デバッグモードでクラッシュしてもうまくいきます。どのように私はこれを修正することができますか? – Bou

1
- (void) viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    self.tableView = nil; 
}