4

NSFetchedResultsControllersアプリ全体にいくつかあり、すべてのビュー コントローラーで、それぞれのデリゲート メソッドを実装しています。ただし、これらのデリゲート メソッドを を実装するすべてのクラスにコピーする代わりに、これらのデリゲート メソッドを実装するNSFetchedResultsControllerクラスを作成し、取得したすべての結果コントローラーのデリゲートをその 1 つのクラスを指すように設定するだけでよいと考えました。これが私が試したことですが、うまくいきません:

デリゲート メソッドは変更対象のテーブル ビューを認識する必要があるため、取得した結果コントローラーごとに個別のデリゲート クラスを作成し、そのクラスのテーブルビューへのポインターを送信するだけでよいと考えました。

FetchedResultsDelegate *delegate = [[FetchedResultsDelegate alloc] initWithTableView:parentTableView];
self.fetchedResultsController.delegate=delegate;
[delegate release];

ただし、これによりBAD_ACCESSクラッシュが発生するため、上記で行っていることを行うべきではないことを意味します。

すべての my に対するすべてのデリゲート要求を処理する単一のデリゲート クラスを作成するにはどうすればよいNSFetchedResultsControllersですか?

編集:@property (nonatomic, retain) FetchedResultsDelegate *delegate; Is this ok?を実行することで問題を解決できました。一部の人々は、保持ではなく割り当てについて何かを言っていますか?

4

1 に答える 1

2

FetchedResultsDelegateデリゲート プロパティは通常、割り当てとして宣言されているため、何も保持されません。たとえば、 NSFetchedResultsControllerはデリゲートを次のように宣言します。

@property(nonatomic, assign) id <NSFetchedResultsControllerDelegate> delegate

したがって、オブジェクトを作成してすぐに破棄しましたが、fetchedResultsController に厄介なダングリング ポインターを与えました。

これを修正するには、デリゲートの保持が必要です。したがって、 UITableViewController クラスに新しいプロパティを追加します

// .h
@property (nonatomic, strong) id<NSFetchedResultsControllerDelegate> tableViewDelegate;

// .m
@synthesize tableViewDelegate = _tableViewDelegate;

次に、フックアップするときに、コードをこれに変更するだけでデリゲートします

FetchedResultsDelegate *delegate = [[FetchedResultsDelegate alloc] initWithTableView:parentTableView];
self.fetchedResultsController.delegate = delegate;
self.tableViewDelegate = delegate;
[delegate release]; delegate = nil;

忘れないで

dealloc でこの新しい ivar を解放します

- (void)dealloc;
{
    // ... other releases
    [_tableViewDelegate release];
    [super dealloc];
}

assign の使用は、所有権のセマンティクスに関するものです。

この場合、他に何もないのでUITableViewController、tableView のデリゲート (例: strong/ ) を所有する必要があります。retain

/ を使用して/NSFetchedResultsControllerを使用assignしない理由は、それを作成したオブジェクトがデリゲートとして機能する可能性が高いためです。これにより、両方のオブジェクトが互いに所有し合い (両方とも互いに保持されます)、保持が発生します。サイクルretainstrongretain

于 2012-04-22T14:50:31.690 に答える