2012-01-02 2 views
2

I는 다음과 같이 보이는 방법 코코아/목표 - C 클래스가 : 내부 블록이 dealloced 된 handler라고하고 할 때, 그러나내부 블록 내에서 블록을 호출

- (void)doWork:(void (^)(void))handler 
{ 
    [self->someObject doActualWork:kWorkID handler:^(Result *result) { 
     if (handler) 
      handler(); 
    }]; 
} 

을 프로그램이 호출 될 때 충돌합니다. 블록이 스택에 저장되고 따라서 doWork:이 완료된 직후에 제거 되었기 때문에 이것이 무엇인지 이해합니다. ARC를 사용하고 있습니다. 이 문제를 해결하려면 어떻게해야합니까?

답변

4

우선, iVar 액세스의 경우 self->은 일반적으로 이상하고 낙담 한 패턴입니다.

나중에 사용하기 위해 저장하기 전에 블록을 복사 했습니까? 비동기 코드를 사용하려는 경우 actualWork:handler: 메소드는 블록을 큐에 넣기 전에 블록을 복사해야합니다.

ARC 하에서조차; ARC는 자동으로 메소드에서 블록 반환을 처리하지만 블록을 인수로 자동으로 처리 할 수 ​​없으며 사용자는 여전히 해당 블록을 복사해야합니다.

이것은 완전히 동기식 코드 인 경우 다른 오류가 발생합니다. 더 많은 단서를 제공해야합니다.

+0

나는 본다. 나는 블록을'actualWork : handler :'에 복사하지 않았다. 고맙습니다. –

관련 문제