-1

I have being asked to repair this code which is not working, it is a common background task.

    __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
    ];

The problem is caused later in the code by ctx being nil. However if I put a breakpoint within the block, I can see that while weakCtx is still valid, ctx get a nil value, which is causing the block to fail.

While on the opposite, weakSelf is being assigned correctly, and works trough the rest of the code.

What am I missing ?

Leonardo
  • 9,607
  • 17
  • 49
  • 89

1 Answers1

0

You don't have to use __weak modifier for a context here, as it's not an ivar (so it isn't retained by self). This should work:

NSManagedObjectContext *ctx=[CDC privateManagedObjectContext];
__weak id weakSelf = self;
[ctx performBlock:^{
    __strong id strongSelf = weakSelf;
    // use `ctx` here
}];
Arek Holko
  • 8,966
  • 4
  • 28
  • 46