0
UIViewController* vc = [[NSClassFromString(record.anObject) alloc] initWithNibName:record.anObject bundle:nil]; 

1) [myNavigationController navigateToViewController:vc animated:NO]; 

2) dispatch_async(dispatch_get_main_queue(), ^(void){ 
    @autorelesepool 
    { 
     [myNavigationController navigateToViewController:vc animated:NO];   
    } 
}); 

탐색 스택에서 그리고 만약 팝업 내가 다음 2를 사용할 때 그때 1을 사용하는 컨트롤러 vc이 해제됩니다 볼 경우 코드 1과 2를 확인하시기 바랍니다 naviagation 스택에서 팝 때 내보기 컨트롤러 할당이 취소되지 않습니다.아이폰 OS : 나는 블록을 dispatch_async을 통과하면보기 컨트롤러 인스턴스를 해제하지 않습니다

나는 ARC을 사용하고 있습니다. 어떤 몸이라도 제 2 구현을 위해 VC의 메모리를 어떻게 비울 수 있습니까? 내가 __block 유형의 임시 변수를 시도하고 disaptch_async 블록의 끝에 nil로 설정했지만 작동하지 않습니다.

답변

1

당신은 시도 할 수 다음 둘 사이

__weak UIViewController *weakVC = vc; 
dispatch_async(dispatch_get_main_queue(), ^(void){ 
    [myNavigationController pushViewController:weakVC animated:NO]; 
} 
+0

나는 이것이 트릭을 할 것이라고 생각한다. –

+0

@Oleg가 맞습니다. 운영자에게 전달되는 모든 것은 약하게 인스턴스화되어야합니다. – AzaFromKaza

+0

@AzaFromKaza : 아니요, 완전히 옳지 않습니다. – newacct

0

유일한 차이점은 다음과 같습니다

  1. 하나는 동 기적으로 동작을 수행가 있다면, 다른 하나는 (그것을 비동기
  2. myNavigationController을 수행하면서 로컬 변수) 및 vc은 비동기 작업이 실행될 때까지 유지됩니다.

vc은 블록에서 참조하므로 비동기 작업이 실행되기 전에 할당 해제되지 않습니다. 그 시점에서 해당 객체에 대한 더 이상 강력한 참조가 없으면 비동기 작업이 실행 된 후에 할당이 해제됩니다.