-1

機能していないこのコードを修復するように依頼されました。これは一般的なバックグラウンド タスクです。

    __weak NSManagedObjectContext *weakCtx=[CDC privateManagedObjectContext]; // convenient class+macro for obtaining a private context queue
    __weak id weakSelf = self;
    [weakCtx performBlock:^{
        __strong id strongSelf = weakSelf;
        __strong NSManagedObjectContext *ctx = weakCtx; // <-- nil
        // more code following
    ];

この問題は、コードの後半でctxnil になることによって発生します。ただし、ブロック内にブレークポイントを配置すると、weakCtx はまだ有効ですが、ctx は nil 値を取得し、ブロックが失敗することがわかります。

反対に、weakSelf は正しく割り当てられており、コードの残りの部分で機能します。

何が欠けていますか?

4

1 に答える 1

0

__weakではないため、ここではコンテキストに修飾子を使用する必要はありませんivar(したがって、によって保持されませんself)。これはうまくいくはずです:

NSManagedObjectContext *ctx=[CDC privateManagedObjectContext];
__weak id weakSelf = self;
[ctx performBlock:^{
    __strong id strongSelf = weakSelf;
    // use `ctx` here
}];
于 2013-10-22T10:13:39.083 に答える