ios Block에서 흔히 볼 수 있는 오류 (3) - 병렬 프로그래밍의 Block 인용

2905 단어
일부 기술형 기업에서는 Block 면접 필기시험 문제에 대해 깊이 있게 묻는다. 다음과 같은 예이다.
실례지만 DemoObj의 대상은 정확하게 석방될 수 있습니까? 왜요?
//DemoObj.m

@interface DemoObj()

@property (nonatomic, strong) NSOperationQueue *queue;

@end

@implementation DemoObj


- (instancetype)init
{
    self = [super init];
    if (self) {
        self.queue = [[NSOperationQueue alloc] init];
    }
    
    return self;
}

- (void)dealloc
{
    NSLog(@"demoobj dealloc");
}

- (void)demoOp:(id)obj
{
    NSLog(@"%@ %@", [NSThread currentThread], obj);
}

- (void)demoBlockOp
{
    for (int i = 0; i < 10; ++i) {
        
        [self.queue addOperationWithBlock:^{
            [self demoOp:@(i)];
        }];
    }
}


//SMViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    DemoObj *obj = [[DemoObj alloc] init];
    
    [obj demoBlockOp];
}

본인의 지난 블로그를 본 독자들은 DemoObj의 대상이 정확하게 풀리지 않는 것은 순환 인용이 생겼기 때문이라고 대답할 수 있습니다.
그러나 실제 상황은 DemoObj의 대상이 정확하게 방출될 수 있으니 독자들이 한번 실행해 보는 것도 괜찮다.
정확하게 방출될 수 있는 이유는 병렬 프로그래밍에서 Block의 관리와 라인의 생성과 소각은 대기열이 책임집니다!큐가 제거되면 큐의 모든 객체가 제거됩니다.
순환 인용은self에서 직접 블록을 강제로 인용해야만 나타난다.

좋은 웹페이지 즐겨찾기