Nur auf neuem iPad 3: wait_fences: Antwort fehlgeschlagen: 10004003

Ich weiß, dass es dazu viele Fragen gibt, aber soweit ich das beurteilen kann, ist dies eine einzigartige Situation, und ich dachte, ich würde es veröffentlichen. Hoffentlich werden hier einige Informationen hinzugefügt, die uns endlich eine Antwort geben können, warum dies mit uns passiert. Ich erhalte den Fehler: wait_fences: Antwort fehlgeschlagen: 10004003, wenn sich mein Gerät dreht. Die Animation meiner Ansichten wird initiiert von:

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

Ich erhalte nur den Fehler auf dem neuen iPad 3. Ich habe genau dasselbe Programm auf einem ursprünglichen iPad und iPhones verwendet, die so niedrig sind wie ein 3GS. Sie alle erhalten den wait_fences-Fehler nicht und drehen sich alle schneller als das iPad 3.

Ich benutze fast ausschließlich Core Graphics, um die Ansichten zu zeichnen. Ich stelle auch sicher, dass sie in einer Größenänderung neu gezeichnet werden, damit ich keine pixeligen Ansichten erhalte. Wenn ich das Neuzeichnen bei Größenänderung deaktiviere, wird dieser Fehler nicht angezeigt (aber ich erhalte vergrößerte Ansichten). Wenn ich die Kerngrafikzeichnung insgesamt deaktiviere, wird der Fehler nicht angezeigt (aber natürlich werden schwarze Ansichten angezeigt).

Ich habe den Time Profiler verwendet und festgestellt, dass der Absturz hauptsächlich beim Zeichnen von Verläufen auftrat:

Ich habe den Code geändert, um Farbverläufe zu füllen, anstatt sie zu zeichnen, und das lindert das Problem. Ich würde sagen, dass die Farbverläufe das Problem sind, außer ich mache diese Animationen in anderen Situationen (außer als Reaktion auf Rotation) und es funktioniert einwandfrei.

Ich möchte auch darauf hinweisen, dass ich besonders darauf geachtet habe, dass ich nur Ansichten animiere, die tatsächlich auf dem Bildschirm angezeigt werden. Ich weiß, dass das Animieren von Ansichten außerhalb des Bildschirms manchmal dazu führen kann, dass dieser Fehler auftritt.

Ich habe den Animationscode nicht eingefügt

Irgendwelche Ideen, warum das passiert? Zumal es nur auf dem iPad 3 passiert?

Für diejenigen, die fragen werden, ist dies der Code, der die Animation ausführt. Es wird normalerweise in einen UIView-Animationsblock eingeschlossen.

- (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];
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage