Только на новом iPad 3: wait_fences: не удалось получить ответ: 10004003

Так что я знаю, что есть много вопросов по этому поводу, но, насколько я могу судить, это уникальная ситуация, поэтому я решил опубликовать ее. Надеемся, что это добавит некоторую информацию, которая может, наконец, дать нам ответ о том, почему это происходит с нами. Я получаю сообщение об ошибке: wait_fences: не удалось получить ответ: 10004003, когда мое устройство вращается. Анимация моих представлений начинается с:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Я только получаю сообщение об ошибке на новом iPad 3. Я использовал точно такую же программу на оригинальном iPad и iPhone, как 3GS. Все они не получают ошибку wait_fences, и все они вращаются быстрее, чем iPad 3.

Я использую Core Graphics почти исключительно для рисования видов. Я также гарантирую, что они перерисовываются при изменении размера, поэтому я не получаю пиксельные представления. Если я отключаю перерисовку при изменении размера, я не получаю эту ошибку (но получаю растянутые виды). Если я вообще отключаю отрисовку основной графики, я не получаю сообщение об ошибке (но, конечно, я получаю черные виды).

Я использовал Time Profiler и обнаружил, что зависание было в основном при рисовании градиентов: enter image description here

Я изменил код, чтобы заполнить, а не рисовать градиенты, и это облегчает проблему. Я бы сказал, что градиенты являются проблемой, за исключением того, что я делаю эти анимации в других ситуациях (кроме в ответ на вращение), и это работает просто отлично.

Я также хотел бы отметить, что я уделил особое внимание тому, чтобы убедиться, что я только анимирую виды, которые на самом деле находятся на экране. Я знаю, что анимация просмотров за пределами экрана может иногда вызывать эту ошибку.

Я не включил код анимации

Есть идеи, почему это происходит? Тем более, что это происходит только на iPad 3?

Для тех, кто спросит, это код, который выполняет анимацию. Обычно он будет помещен в блок анимации UIView.

- (void) setFramesForFocusView:(CustomControl *)focusView atX:(CGFloat)x showInput:(BOOL)showInput{
    CGSize bSize = self.bounds.size;
    CGRect fRect = focusView.frame;
    fRect.size.width = bSize.width;

    CGRect iRect;
    if (focusView.inputViewIsSystemKeyboard){
        if (_keyboardRect.origin.y < 0 || _keyboardRect.origin.y >= CGRectGetMaxY(self.bounds) || CGRectIsEmpty(_keyboardRect) || CGRectGetMaxY(_keyboardRect) > CGRectGetMaxY(self.bounds)) return;
        iRect = _keyboardRect;
    } else {
        iRect = (focusView.inputUIView && showInput) ? CGRectMake(0, bSize.height / 2, bSize.width, bSize.height / 2) : CGRectZero;
    }

    CGRect iaRect = focusView.inputAccessoryUIView.frame;
    CGFloat availableFieldHeight = iRect.origin.y - iaRect.size.height;

    iRect.size.width = bSize.width;
    iaRect.size.width = bSize.width;

    if (!showInput){
        iRect.origin.y = bSize.height;
    }
    iaRect.origin.y = iRect.origin.y - iaRect.size.height;

    iRect.origin.x = x;
    iaRect.origin.x = x;
    focusView.inputUIView.frame = iRect;
    focusView.inputAccessoryUIView.frame = iaRect;

    if (focusView.expandInput){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    } else {
        if (focusView.labelPlacement != LabelPlacementTop && focusView.labelPlacement != LabelPlacementBottom){
            fRect.size.height = _currentView.storedFrame.size.height + [focusView.label.text sizeWithFont:focusView.label.font].height; 
        }
        fRect.origin.y = availableFieldHeight - fRect.size.height;
    }
    if (fRect.size.height > availableFieldHeight){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    }
    fRect.origin.x = x;
    [focusView setLabelPlacement:LabelPlacementTop toFrame:fRect];
}

Ответы на вопрос(1)

Ваш ответ на вопрос