Один оператор в реализации метода занимает 90% времени выполнения. Заставляет приложение получать предупреждения памяти и сбой
У меня есть приложение для фотосъемки, которое использует AVFoundation. Когда пользователь нажимает кнопку, чтобы сделать снимок, происходит много вещей, таких как поворот фотографии в правильную ориентацию, кадрирование и т. Д.
При получении изображений я получал сообщения "Предупреждение о получении памяти" в консоли, и после того, как я собрал пару изображений и удалил их, приложение зависало в 99% случаев.
Я просто пошел и запустил приложение с инструментами, и есть один метод в дереве вызовов, который занимает 53,6% времени выполнения. Я дважды щелкнул по этому методу, и мне показали процент времени, потраченного на каждый оператор в реализации этого метода, и есть один отдельный оператор, который занимает 90,5% времени.
Очевидно, именно это вызывает проблемы с памятью и сбой приложения, но я не совсем уверен, почему или как это исправить.
Вот код реализации метода:
-(UIImage*) rotate:(UIImage*) src andOrientation:(UIImageOrientation)orientation
{
UIGraphicsBeginImageContext(src.size);
CGContextRef context=(UIGraphicsGetCurrentContext());
if (orientation == UIImageOrientationRight) {
CGContextRotateCTM (context, 90/180*M_PI) ;
} else if (orientation == UIImageOrientationLeft) {
CGContextRotateCTM (context, -90/180*M_PI);
} else if (orientation == UIImageOrientationDown) {
// NOTHING
} else if (orientation == UIImageOrientationUp) {
CGContextRotateCTM (context, 90/180*M_PI);
}
[src drawAtPoint:CGPointMake(0, 0)];
UIImage *img=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Утверждение, которое занимает 90,5% времени:
[src drawAtPoint:CGPointMake(0, 0)];
По сути, цель реализации этого метода заключается в том, чтобы повернуть захваченное фото в правильную ориентацию, поскольку iOS по умолчанию будет сохранять изображение в альбомной ориентации, даже если оно было просто захвачено в портретной ориентации. Таким образом, вы должны повернуть обратно в портрет, чтобы получить его так же, как он был захвачен.
Я не уверен, почему одно приведенное выше утверждение вызывает проблемы, но мне действительно нужно это исправить, чтобы я мог повысить производительность своего приложения и предотвратить возникновение этих сбоев.