0

メソッドを介してデリゲートを別のオブジェクトに渡そうとしています。短時間は機能しますが、その後nullになります。私はそれを引き起こしているものを理解したと思いますが、それを解決する方法は理解していません。

そのため、iOSのブロックは、参照されているすべての変数を自動的にコピーします。ユーザーがデリゲートオブジェクトを渡すメソッドがあります。管理対象オブジェクトコンテキストに対してブロックが実行され、管理対象オブジェクトコンテキストが、デリゲートが渡されるWebリクエストを作成します。私が起こっていると思うのは、このブロックがデリゲートオブジェクトのコピーを作成し、それをリクエストに渡すことですが、ブロックは実行を終了し、デリゲートが解放されます。

ブロックがコピーを作成するのではなく、元のデリゲートオブジェクトを単純に渡す方法はありますか?

NSManagedObjectContext *context = [[MPCoreDataManager sharedInstance] managedObjectContext];
[context performBlock:^{
    __block NSError *error;
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([self class])];
    [request setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:key ascending:asc selector:@selector(caseInsensitiveCompare:)]]];

    NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                                 managedObjectContext:context
                                                                                   sectionNameKeyPath:keyPath
                                                                                            cacheName:nil];

    [controller performFetch:&error];

    if (!controller.fetchedObjects || controller.fetchedObjects.count == 0) {
        // Nothing found or an error, query the server instead
                NSString *url = [NSString stringWithFormat:@"%@%@", kMP_BASE_API_URL, [self baseURL]];
        MPRequest *objRequest = [MPRequest requestWithURL:url];
          objRequest.delegate = delegate;

        [objRequest setRequestMethod:@"GET"];
        [MPUser signRequest:objRequest];

        [objRequest submit:^(MPResponse *resp, NSError *err) {
            if (err) {
                block(nil, err);
            } else {
                NSArray *objects = [self createListWithResponse:resp];
                         objects = [MPModel saveAllLocally:objects forEntityName:NSStringFromClass([self class])];
                [controller performFetch:&error];
                block(controller, nil);
            }

        }];

    } else {
        // Great, we found something :)
        block (controller, nil);
    }
}];

これは私が使用しているコードです。ご覧のとおり、ここではデリゲートが使用されていますobjRequest.delegate = delegate;が、オリジナルではなくコピーであるため、ARCによってリリースされています。

どうすればこれを回避できますか

4

2 に答える 2

0

整理しました。私がばかであり、デリゲートが null であるという NSLog からの出力が実際には完全に別の要求であり、ブロックのメモリ管理であることに気付いていなかったことが混在していました。

于 2013-01-08T23:34:53.300 に答える
-1

ブロックは内部のオブジェクトをコピーせず、キャプチャするだけです (ARC の保持カウントが増加します)。

あなたのデリゲートは弱い参照だと思います。このため、ブロックによってキャプチャされません。デリゲートへの強い参照をブロックに渡すことで、この問題を解決できます。

于 2013-01-08T22:55:05.970 に答える