2014-03-31 3 views
1

UICollectionView의 앱을 개발 중입니다.스크롤 할 때 UICollectionView에 메모리 경고가 발생했습니다.

CollectionView 갤러리는 각 행마다 3 개의 이미지가 있습니다.

CollectionView

나는 30 개 사진, 첫 번째 URL 및 코드 그룹의 서버에서 이미지를 얻고, 셀이 cellForItemAtIndexPath에 표시 될 것입니다 때 비동기 그 사진을 다운로드 SDWebImage Library를 사용합니다. 매 30 장의 그림마다 다시 웹 서비스를 호출하고 30 장의 그림을 제한 및 오프셋으로 더 전송합니다. 이것은 100 번 발생할 수 있으며, 3000 장의 사진이있는 프로파일이 있습니다.

내 문제는 내 iPhone 4에서 앱을 시작한 후 빠른 스크롤을 한 후 Received Memory Warnings이 시작되고 몇 가지 경고가 발생하면 앱이 다운됩니다. 시뮬레이터에서 동일한 테스트를 수행하면 아무런 문제가 발생하지 않습니다.

I 30 개 이미지를 다운로드 할 때마다 I는 CollectionView 데이터 reloadcollectionView를 처리하는 결과에 NSMutableArray *data property 어레이를 추가한다. 악기를 배분하여 사용하려했지만 무슨 일이 일어나고 있는지 이해하는 것은 매우 어렵습니다.

내가 세포

-(UICollectionViewCell *)collectionView:(LZProfileImagesCollectionView *)aCollectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    if(aCollectionView == self.imagesCollectionView){ 
     if([self.data count] - 12 == indexPath.row){ 
      self.photoOffset += 30; 
      [self loadUserData]; 
     } 

     LZProfileCollectionViewCell * cell = (LZProfileCollectionViewCell *)[imagesCollectionView dequeueReusableCellWithReuseIdentifier:ImageCollectionCellIdentifier forIndexPath:indexPath]; 
     Image *image =(self.data)[indexPath.row]; 
     [cell configureCellWithImage:image]; 

     return cell; 
    } 
    return nil; 
} 

을 만드는 데 사용하는 코드입니다 그리고 LZProfileCollectionViewCell 셀에 내가 가진이 하나 : 나는 3 후 SDWebImage

에서 setImageWithURL을 촬영 한

-(void)configureCellWithImage:(Image *)image 
{ 
    [self setNeedsDisplay]; 

    // Imagen 
    NSString *imageUrl = [kBaseURL stringByAppendingString:image.imageStringUrl]; 
    [self.pictureImg setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:kDefaultLoadingImage]]; 
    [self.pictureImg setContentMode:UIViewContentModeScaleAspectFit]; 

} 

분 기기 (통계)에서이 스냅 샷을 얻습니다.

당신은 당신이 결국 메모리가 부족하려고 많은 이미지를 캐시 그래서 일단

Statistics

는 배열에 미리

+0

타사 라이브러리를 사용하는 경우 적절한 캐싱을 위해 구성했는지 확인해야합니다. 또한 메모리를 비울 필요가있을 때 캐시를 지울 책임이 있습니다. Allocations 장비는 메모리가 사용되는 위치에 대해 무엇을 말합니까? –

+0

일반적인 요청에는'AFNetworking'을 사용하고 이미지 비동기 다운로드에는'SDWebImage'를 사용합니다. Instruments 할당에서 무엇을보고 싶습니까? 호출 트리, 할당 목록? – croigsalvador

+0

'Statistics'->'Object Summary'로 시작하여 가장 상위의'Live Bytes' 객체를보십시오. 또는 스크린 샷을 게시하십시오. 일부 힙 샷도 찍으십시오. –

답변

0

글쎄, 당신은 모든 이미지를 캐싱하는 감사합니다. 시뮬레이터는 시뮬레이터가 실행하는 컴퓨터만큼의 메모리를 가지고 있기 때문에 시뮬레이터에서는 발생하지 않으므로 메모리가 부족한 경우는 거의 없지만 실제 장치는 매우 빨리 소모됩니다. 나는 메모리 오류를 직접 처리하고 배열을 비우고 새로운 이미지를위한 새로운 공간을 확보했다. 또는 특정 임계 값에 도달 한 후에 이미지를 덤프 할 수있는 방법이 필요한 경우 잠시 동안 보지 않은 이미지를 유지하고 지우는 자체 캐싱 메커니즘을 만드는 것이 좋습니다.

+0

하지만 .. 내 배열은 사진 자체가 아니라 사진의 URL과 코드 만 저장합니다. – croigsalvador

+0

이것은 올바른 대답이 아니며 문제는 각 셀에로드 된 이미지를 공개하지 않는다는 것입니다. – Gabox

0

– didReceiveMemoryWarning의 방법에서는 이미지가 저장된 배열의 일부 메모리를 비워야합니다. 어쩌면 표시하지 않는 첫 번째 이미지는 보조 배열과 같은 두 번째 배열을 저장했을 것입니다.

+0

하지만 다시 스크롤하면 , 배열의 항목을 다시 바꾸어야합니다. 그렇지 않아야합니까? – croigsalvador

0

많은 수의 UIImage 개체가 메모리에 저장되기 때문에 이러한 현상이 발생할 수 있습니다. 대신 디스크에 캐시 할 수 있습니다. AFNetworking에는이 모든 것을 자동으로 처리하는 멋진 UIImageView category이 있습니다.

DataSource 배열에 이미지를 저장하지 않으면 그 이미지가 다른 곳에서 유지되고있는 것이므로 이는 버그입니다.

또한 dequeuing 셀이어야하며 새 셀을 만들지 않아야합니다.

+0

'setImageWithURL' SDWebImage 라이브러리 메소드를 사용합니다. 비슷한가요? – croigsalvador

+0

그들의 궁극적 인 효과는 비슷할 수 있지만 SDWebImage가 디스크 캐싱을하는지 여부는 확실하지 않습니다. – rounak

+0

SDWebImage ** 자동 캐시 만료 처리 기능을 갖춘 비동기식 메모리 + 디스크 이미지 캐싱 ** https://github.com/rs/SDWebImage – croigsalvador

0

나는 이와 비슷한 상황을 경험했기 때문에 그 이유는 조금 다르다.

UITableViewCell 내부에 가로 UICollectionView가 있습니다. UICollectionView를 오른쪽 및 왼쪽으로 빠르게 스크롤하면 전체 UI (심지어 홈 버튼)가 멈추고 잠시 후 didReceiveMemoryWarning 호출 없이도 콘솔에서 "메시지 (디버거에서 메시지 : 종료 된 메모리 문제")와 충돌합니다.

UI 구성 요소는 없지만 변경 사항이없는 UICollectionViewCell로 테스트했습니다. XCode Profile 도구는 실제로 UI 구성 요소가 없더라도 UI가 중단 될 때까지 메모리를 계속 할당한다고 말합니다.

만 의심스러운 점 I 함께 (모든 수퍼 가장자리에 고정 맞춤에 UIView)를 UICollectionViewCell의 하위 뷰의 폭을 설정 이였다 AppDelegate.window.size.width 0.35는 UICollectionViewCell의 폭을 결정하고, 그 부동 소수점 값이었다 * like 130.25

이 값을 130으로 하드 코딩하면 모든 충돌이 사라집니다. 나는 130.25의이 모호한 가치와 함께 무언가가 두포 밑에서 일어나고 있다고 생각한다. 그리고 폭을 때때로 130이나 130.25로 결정한다.

그래서 저는 CGFloat (Int (AppDelegate.window.size.width * 0.35))을 사용하고 있습니다.

관련 문제