0

업데이트이 코드는 실제로 문제가없는 부분입니다. 모든 CoreGraphics 행을 주석 처리하고 배열의 첫 번째 이미지를 결과로 반환해도 충돌이 발생하지 않도록하지 않으므로 더 먼 상류로보아야합니다.CoreGraphics 메모리 경고 및 크래시; 악기에 메모리 누출이 없음

저는 75ms NSTimer에서 실행하고 있습니다. 480x360 이미지로 완벽하게 작동하며 충돌없이 하루 종일 실행됩니다.

그러나 1024x768 인 이미지를 보내면 약 20 초 후에 오류가 발생하여 몇 가지 메모리 부족 경고가 표시됩니다.

두 경우 모두 계측기는 평범한 메모리 사용량을 보여줍니다 : 평 균 할당 그래프, 실제 바이트의 1 메가 바이트 미만, 누출 없음.

그럼, 어떻게됩니까? Core Graphics는 어떻게 보이지 않고 너무 많은 메모리를 사용합니까?

또한 언급할만한 가치가 있습니다. (NSMutableArray *) img에는 ​​이미지가 많지 않습니다. 일반적으로 3 개, 때로는 2 개 또는 4 개입니다. 상관없이 충돌합니다. 두 개 밖에 없으면 충돌이 조금 더 빨리 줄어 듭니다.

- (UIImage*) imagefromImages:(NSMutableArray*)imgs andFilterName:(NSString*)filterName { 

    UIImage *tmpResultant = [imgs objectAtIndex:0]; 

    CGSize s = [tmpResultant size]; 

    UIGraphicsBeginImageContext(s); 

    [tmpResultant drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeNormal alpha:1.0]; 

    for (int i=1; i<[imgs count]; i++) { [[imgs objectAtIndex:i] drawInRect:CGRectMake(0, 0, s.width, s.height) blendMode:kCGBlendModeMultiply alpha:1.0]; } 

    tmpResultant = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return tmpResultant; 
} 
+0

메모리에 충돌 로그가 얼마나 표시됩니까? '[UIImage imageNamed :]'를 사용하고 있습니까? – Kevin

+0

어디에서나 [UIImage imageNamed :]를 사용하지 않습니다. 모든 이미지가 카메라에서 캡처되어 이미지의 NSMutableArrays를 반환하는 imageBuffer 클래스로 전송됩니다. 그것은 충돌 로그 출력없이 충돌하지만 장치 로그에서 프로세스가 62582 rpages를 사용하고있는 것처럼 보입니다. –

답변

0

내가 좋아하는 소리는 나와있는 코드가 아닙니다. 화면에 표시되는 이미지에는 너비 * 높이 * bytes_per_pixel 인 앱 메모리 외부에 백업 저장소가 있습니다. 또한 배킹 스토어가 너무 많으면 메모리 경고 및 앱 종료가 발생합니다.

표시를 위해 이미지의 최적화 된 버전을 작게 만들거나지지 저장을 해제 할 수 있도록 최적화해야 할 수도 있습니다. 변경되지 않는 특정 레이어에 대한 래스터 화를 설정하면 UIImage로 작업하는 것과 달리 CGImage에 직접 레이어 내용을 설정할 수도 있습니다.

주위에 다른 코드가없는 문제를 보여주는 샘플 프로젝트를 만들고 메모리가 부족한 지 확인해야합니다. 그러나 여러분이 보여준 코드만으로도 다른 곳에서와 마찬가지로 isse를 재현 할 수 없다는 것을 알게 될 것으로 생각됩니다.

+0

이것은 정확하게 맞습니다. 저장되는 UIImage의 수를 줄였습니다. 이로 인해 충돌이 멈추었습니다. 이 제한 사항을 해결하려면 이미지를'UIImageJPEGRepresentation's로 저장 한 다음 필요에 따라 다시 [UIImage imageWithData :]로 만들어 보겠습니다. 다행히도 충분히 빠를 것입니다. –