2013-10-22 3 views
-1

작동하지 않는이 코드를 복구하라는 요청을 받았지만 일반적인 배경 작업입니다.performBlock 내에 할당 된 경우 NSManagedObjectContext가 없음

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

문제는 나중에 ctx이 아니므로 발생합니다. 그러나 블록 내에 중단 점을 넣으면 weakCtx가 유효하지만 ctx가 nil 값을 얻음으로써 블록이 실패하게됩니다.

반면에 weakSelf가 올바르게 할당되고 나머지 코드가 작동합니다.

무엇이 누락 되었습니까?

+0

같은 downvoter ... 와서, downvote, 그리고 가서 ... – Leonardo

답변

0

ivar이 아니기 때문에 __weak 수정자를 사용할 필요가 없습니다. 따라서 self에 의해 유지되지 않습니다. 이게 작동해야합니다 :

NSManagedObjectContext *ctx=[CDC privateManagedObjectContext]; 
__weak id weakSelf = self; 
[ctx performBlock:^{ 
    __strong id strongSelf = weakSelf; 
    // use `ctx` here 
}];