2016-08-10 6 views
1

보존주기에서 오는 것처럼 보이는 메모리 누수가 있습니다. 메모리 할당 크기가 때마다 증가하고이 코드를 실행 : 나는 메모리 남용 이벤트를 얻을 때까지 경계없이자기없이 사이클을 유지합니까?

self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextPhoto) userInfo:nil repeats:YES]; 

총 메모리 사용 증가 : 코드는 2 초 타이머에 루핑

- (void)nextPhoto { 
    self.photoIndex++; 
    if (self.photoIndex >= [self.photos count]) { 
     self.photoIndex = 0; 
    } 
    __weak Photo *photo = [self.photos objectAtIndex:self.photoIndex]; 
    [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:photo.thumbnailURLString] options:SDWebImageRetryFailed progress:nil 
               completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { 

               }]; 
} 

.

왜이 코드가 유지주기를 유발합니까? 이 상황에서 자아를 다루기 위해 특별한 방법이 있습니까?

self.photosNSMutableArray

self.photoIndexNSInteger

SDWebImageManager가 잘 유지 라이브러리입니다 : https://github.com/rs/SDWebImage 그리고 내가 어떤 문제가 표시되지 않습니다

+0

속성에서'[SDWebImageManager sharedManager]'를 (를) 이동하려 했습니까? 그리고 코드를 완성 블록에 게시 할 수 있습니까? –

+0

모든 이미지를 다운로드 한 후에 다운로드를 중지하는 대신 0 인덱스에서 이미지를 다시 다운로드하기 시작하는 이유는 매 시간 간격마다 타이머가이 메서드를 호출하기 때문에 해당 간격 내에서 순 속도가 느린 경우 이미지가 언젠가 다운로드되지 않습니다. –

+0

@SaintThread 완료 블록에서 모든 코드를 제거했지만 여전히 메모리 누수가 발생합니다. – Cbas

답변

1

문제없이 많은 다른 지역에서 사용 완성 블록에서 자아를 사용하더라도 여기에 유지 사이클이 포함됩니다. 블록 소유자는 SDWebImageManager이므로 아무런 문제가 없습니다. 보존주기는 viewController의 속성에 블록을 저장하는 경우 발생할 수 있습니다. 그 이유는 블록을 보유하는 블록을 소유하게 될 것이기 때문입니다. 여기서는 imho가 발생하지 않습니다.

이제 문제는 UIImage에서 비롯된 것 같습니다. 나는 당신이 블록에서 무엇을하는지에 달렸지 만 이미지를 저장하는 경우 매 2 초마다 새 이미지가 만들어지고 결국 실패 할 것입니다. 이미 다운로드 된 이미지의 캐시를 유지해야하며 필요한 경우에만 다운로드하려고합니다. 예를 들어 url을 키로 사용하고 UIImage를 값으로 추가하면 이미지를 한 번만 다운로드 할 수 있습니다.

+0

완료 블록에 코드가 없습니다. 또한 SDWebImageManager는 이미 캐싱을 처리합니다. – Cbas

0

좋아, 나는 이걸로 잤어야했다. 기능은 실제로 정확하게 작동하고 바운더리없이 증가하고있는 self.photos이었다. 배열의 크기에 제한을두면 "누수"가 수정되었습니다.