2014-06-12 6 views
1

사진이 좋은 해상도로 저장되는 SQLite에 큰 테이블이있어서 큰 이미지 크기를 유지하므로 이미지 크기를 조정하고 동일한 프로세스에서 DB 테이블을 업데이트하려고합니다. SQLite DB 작업을 위해 FMDB 래퍼를 사용하고 있습니다.NSData 및 UIImage가 iOS7에서 릴리즈되지 않았습니다.

글쎄, 악기를 사용하면 NSData를 볼 수 있으며 UIImage는 출시되지 않고 메모리가 빠르게 커져서 내 앱이 닫힙니다.

어떻게해야합니까?

가 여기 코드입니다 : 인해 루프

FMResultSet *aFMResultSet = [database executeQuery:@"SELECT id, image FROM Images WHERE LENGTH(image)> 1000000;" ]; 

while([aFMResultSet next]){ 

    int aId = [aFMResultSet intForColumn:@"id"]; 

    NSData *aDataImage = [aFMResultSet dataForColumn:@"image"]; 
    UIImage* aImage = [UIImage imageWithData:aDataImage]; 

    UIImage *aResizedImage = [Utils resizedImage:aImage withRect:CGRectMake(0, 0, 324, 242)]; //(2592x1936)/16 
    NSData *aDataResizedThumbnail = UIImageJPEGRepresentation(aResizedImage,0.5f); 

    [database executeUpdate:@"UPDATE Images SET image = ? WHERE id = ?;", aDataResizedThumbnail, [NSNumber numberWithInt:aId],nil]; 

}

+0

을 NSData * imageData의 UIImagePNGRepresentation = (화상); –

+2

당신은'autoreleasepool'이 필요합니다. – Jack

+2

루프에 있기 때문에 메모리가 자동으로 해제되지 않습니다. 해결책은 while 루프에 @autoreleasepool을 추가하는 것입니다. BTW : 하나는 풀 내부에 풀을 추가 할 수 있습니다. –

답변

2

, 시스템은 더 이상 필요하지 않은 메모리를 해제 할 수있는 기회를 결코 있습니다.

이 같은 autoreleasepool에서 루프의 내측 랩 이렇게하는 시스템을 강제

FMResultSet *aFMResultSet = [database executeQuery:@"SELECT id, image FROM Images WHERE LENGTH(image)> 1000000;" ]; 

while([aFMResultSet next]){ 
    int aId = [aFMResultSet intForColumn:@"id"]; 
    @autoreleasepool { 
     NSData *aDataImage = [aFMResultSet dataForColumn:@"image"]; 
     UIImage* aImage = [UIImage imageWithData:aDataImage]; 

     UIImage *aResizedImage = [Utils resizedImage:aImage withRect:CGRectMake(0, 0, 324, 242)]; //(2592x1936)/16 
     NSData *aDataResizedThumbnail = UIImageJPEGRepresentation(aResizedImage,0.5f); 

     [database executeUpdate:@"UPDATE Images SET image = ? WHERE id = ?;", aDataResizedThumbnail, [NSNumber numberWithInt:aId],nil]; 
    } 
}