1

次のコード (http://stackoverflow.com/questions/44712​​89/how-to-filter-nsfetchedresultscontroller-coredata-with-uisearchdisplaycontroll) で作成されたモーダル ビュー コントローラーでテーブル ビューを表示しているので、コア データ、NSFetchedResults を使用できます。そしてUISearchbar。最終的に、テーブルビュー/検索/詳細ビューの最後ですべてがうまく機能するようになりましたが、理解できないショーストッパーを発見しました。

次を使用してテーブルビューを閉じると:

  - (IBAction)doneButtonPressed:(id)sender {[self dismissModalViewControllerAnimated:YES];}

モーダル ビューが閉じ、メイン ビューが読み込まれ、アプリがクラッシュします。メイン ビュー コントローラーからこの nslog を呼び出すことができるようになりました。

-(void) viewDidAppear:(BOOL)animated { NSLog(@"do I crash");}

ここで不正なアクセス エラーが発生します。

   int main(int argc, char *argv[]) 
   {
       @autoreleasepool {
         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}}

問題はアークに関連している可能性があると思います。使用したコード テンプレートは arc 用ではなかったので、次の変更を加えました。

    @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
    @property (nonatomic, retain, readonly) NSFetchedResultsController *fetchedResultsController;

    @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
    @property (nonatomic, strong, readonly) NSFetchedResultsController *fetchedResultsController;

    @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
    @property (nonatomic, retain) NSFetchedResultsController *searchFetchedResultsController;
    @property (nonatomic, retain) UISearchDisplayController *mySearchDisplayController;

    @property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
    @property (nonatomic, strong) NSFetchedResultsController *searchFetchedResultsController;
    @property (nonatomic, strong) UISearchDisplayController *mySearchDisplayController;

さらに、didreceivememorywarning から以下を削除しました。

   [fetchedResultsController_ release];
   [searchFetchedResultsController_ release];

そして以下を変更しました - (NSFetchedResultsController *)fetchedResultsController

    return [[fetchedResultsController_ retain] autorelease];

    return fetchedResultsController;

そして - (NSFetchedResultsController *)searchFetchedResultsController

    return [[searchFetchedResultsController_ retain] autorelease];

    return searchFetchedResultsController;

私は完全に困惑しています。どんな援助でも大歓迎です!

4

1 に答える 1

1

さて、問題は解決しました。私がこの問題を抱えている最初または最後だとは想像できないので、同様の問題が発生している場合に備えて....

検索コードを精査した後 (モーダル ビューを閉じる前に検索してもクラッシュしないので、何か関係があるに違いないと思いました)、それでも問題は見つかりませんでした。

しかし、searchBar と searchDisplayDelegate の両方をプログラムで作成していることに気付きました。気まぐれで、ストーリーボードに searchBar と displayDelegate を作成し、それらをリンクすることにしました。それらが追加されたら、loadView からコメントアウトしました。

//  UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 44.0)];
//   self.mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

さらに、それらをストーリーボードに追加すると、viewDidUnload で以下が自動作成されます。

[self setSearchBar:nil];
[self setMySearchDisplayController:nil];

ビオラ!もうクラッシュすることはありません... mySearchDisplayController が適切にアンロードされていなかっただけだと思います。他の人に役立つことを願っています!

于 2012-06-03T13:36:15.510 に答える