0

MRC 및 ARC에서 비동기 블록 내에 __block 객체를 쉽게 할당하고 유지할 수 있는지 궁금합니다. 최소한의 변경으로 코드를 다시 작성하면서 다음 코드를 얻었습니다. 비동기 블록에서 이미지를 반환하려고 할 때 막혔습니다. 문제는 코드가 언젠가 ARC로 변환된다는 것입니다. 난 변환 후 숨겨진 메모리 추락 사고 싶지 않아요. 내 옵션은 그런 일이 사제 객체 홀더, 배열이나 다른 사람을 사용 비동기 블록 외부 변수에 객체 할당

  • 존재하는 경우 GCD 객체 홀더를 사용

    1. 했다
    2. 직접 (내가 사용) 배열에 이미지
    3. 추가
    4. 다른 구성

    배경 스레드 기본적 코드 부하 복수의 화상에 코드를 재 작성. // image deallocated :(을 검색하면 위치가 표시됩니다.

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    
        ALAssetsLibrary *assetsLibrary = nil; 
        for (int i = 0; i < sources.count; ++i) { 
    
         __block UIImage *image = nil; 
         id source = sources[i]; 
    
         if ([source isKindOfClass:[NSString class]]) { 
    
          image = something 
    
         } else if ([source isKindOfClass:[NSURL class]]) { 
    
          NSURL *url = source; 
    
          if ([url.scheme isEqualToString:@"assets-library"]) { 
    
           dispatch_group_t group = dispatch_group_create(); 
    
           if (!assetsLibrary) 
            assetsLibrary = [[[ALAssetsLibrary alloc] init] autorelease]; 
    
           dispatch_group_enter(group); 
           [assetsLibrary assetForURL:url resultBlock:^(ALAsset *asset) { 
    
            image = something 
            dispatch_group_leave(group); 
    
           } failureBlock:^(NSError *error) { 
    
            dispatch_group_leave(group); 
    
           }]; 
    
           dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
    
           // image deallocated :(
    
          } else if (url.isFileURL) { 
    
           image = something 
    
          } 
         } 
         // add image to an array 
        } 
    
        dispatch_async(dispatch_get_main_queue(), ^{ 
    
         // notify 
    
        }); 
    }); 
    
  • 답변

    0

    나는 이미지 변수 선언문을 옮기는 것이 이것에 대해 생각하는 첫 번째 단계라고 생각합니다. 여러 동시 작업에 대해 하나의 이미지 변수를 가질 것으로 기대할 수는 없습니다.

    그래서 시작하는

    , 이제 그 후 this-

    ALAssetsLibrary *assetsLibrary = nil; 
    for (int i = 0; i < sources.count; ++i) { 
    __block UIImage *image = nil; 
    

    을하자, 당신은 현재 배열에있는 UIImage 인스턴스를 유지하는? 권장하지 않습니다. 이러한 이미지를 문서 디렉토리에 쓰고 나중에 필요할 때 읽을 수있는 방법을 찾아보십시오. UIImage 인스턴스를 메모리에 유지하면 심각한 메모리 과다 사용 문제가 발생할 수 있습니다.

    문서 디렉토리에 이미지를 쓰려면 명명 규칙이 필요합니다. 이미지로드가 완료되면 로컬 폴더에 저장 한 다음 나중에 읽을 수 있습니다.

    하나의 이미지가로드 되 자마자 알림 완료 부분을 호출하고 다른 이미지를 받으면 알릴 수 있습니다. 디자인이 어떻게 작동하는지 잘 모릅니다.

    또한 여러 그룹을 생성하는 것으로 나타났습니다. 외부 for 루프를 이동 for 루프 여기 -

    dispatch_group_t group = dispatch_group_create(); 
    

    내부의 각 반복에 하나 개의 새로운 그룹은 좋은 호출 될 것이다.

    희망이 도움이됩니다.

    +0

    루프 내부의 작업은 직렬입니다. 이미지 변수의 위치는 편집 후 잘못된 위치에 놓기 때문에 잘못되었습니다. 코드의 목적은 이미지를 메모리에로드하는 것입니다. – keithyip

    +0

    @keithyip 최대 이미지 수는 몇 개입니까? –

    +0

    @keithyip ** dispatch_group_t 그룹 = dispatch_group_create(); **를 for 루프 외부로 옮겨서는 안됩니까? –