2

올바르게 작동하는지 알아야합니다. 응용 프로그램은 정상적으로 실행되고 있지만 수명주기가 올바르게 유지되는지 확신 할 수 없습니다 (누출?).블록 및 ARC가있는 메모리 관리, 누출?

참고 : 계측기에는 누출이 없습니다.

메소드 AAA의 코드는 : 어떤 클래스 A의 :

- (void) aaa { 
    NSString *path = ...something...; 

    NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{ 
    // using path 
    [self somethingElseWith:path]; 
    }]; 

    [self.aQueue addOperation:theOp]; 
} 

그래서 나는 aQueue (NSOperationQueue *)에 넣어 블록을 만들 수 있습니다. 목표는 GUI가 응답 성을 유지할 수 있도록 long running somethingElseWith : 메소드를 주 스레드에서 오프로드하는 것입니다.

블록 안에는 aaa : 메서드의 끝에서 범위를 벗어날 로컬 var "path"가 참조됩니다.

문서를 올바르게 읽으면 블록이 '경로'에 보관됩니다. 그러나 ARC는이 블록의 끝에 암시 적으로 릴리즈를 삽입합니까? 논리적이고 멋질 것입니다.

또는 '경로'를 __block으로 선언하고 블록 끝에있는 nil에 할당해야합니까? (수동 ...)

잘 모르겠습니다.이 컨텍스트에서 __weak을 사용하는 방법을 알고 있습니다.

답변

6

설명한다. 그러나 self에 대한 weak 참조를 사용하여 보유주기를 피할 필요가 있습니다. aQueuestrong 참조 인 경우 유지주기가 있으므로 self이 공개되지 않을 수 있습니다.

솔루션 :

- (void) aaa { 
    NSString *path = ...something...; 

    __weak id self_ = self; 
    NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{ 
    // using path 
    [self_ somethingElseWith:path]; 
    }]; 

    [self.aQueue addOperation:theOp]; 
} 

클래스가 더 이상 존재하지 않는해야 후 작업이 호출되지 않습니다 있는지 확인하십시오.

+0

감사합니다. 질문 : ARC가 사용되지 않으면'path' 변수도 괜찮습니까? 또는 블록의 끝에'[경로 해제]'가 필요합니까? – malaba

+0

@malaba 블록이 당신을 위해 경로를 유지하고 블록이 할당 해제/범위를 벗어날 때 해제하기 때문에 경로 변수는 ARC의 유무에 관계없이 잘됩니다. – Joe

3

블록은 자동으로 둘러싸는 범위의 모든 지역 주민을위한 메모리 관리를 처리합니다. 이 경우 유지/해제 쌍에 대해 걱정할 필요가 없습니다. 블록의 범위 내에서 pathconst이 되니 유의하십시오. 블록 내에서 path을 변경할 수있게하려면 __block 속성을 사용하십시오. 블록 변수를 처리

다른 방법은 path 변수 괜찮다 상세 here: Blocks and Variables