it-swarm.com.de

ungültiger Kontext 0x0 unter iOS 7.0 und Systemverschlechterung

Ich habe so viele Suchergebnisse gelesen, die ich zu diesem gefürchteten Problem finden konnte. Leider scheint sich jedes auf einen bestimmten Funktionsaufruf zu konzentrieren.

Mein Problem ist, dass ich den gleichen Fehler von mehreren Funktionen bekomme, von denen ich schätze, dass sie von Funktionen aufgerufen werden, die ich verwende.

Darüber hinaus befindet sich der eigentliche Code in einem benutzerdefinierten privaten Rahmen, der in ein anderes Projekt importiert wird. Das Debuggen ist daher nicht so einfach.

Kann mir jemand die richtige Richtung zeigen? Ich habe das Gefühl, ich rufe bestimmte Methoden falsch oder mit schlechtem Kontext auf, aber die Ausgabe von Xcode ist an dieser Stelle nicht sehr hilfreich.

: CGContextSetFillColorWithColor: ungültiger Kontext 0x0. Das ist ein schwerwiegender Fehler. Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet ein ungültiger Kontext und trägt damit zu einer allgemeinen Verschlechterung bei der Systemstabilität und Zuverlässigkeit. Dieser Hinweis ist eine freundliche Genehmigung: bitte Beheben Sie dieses Problem. Bei einem anstehenden Update wird dies zu einem schwerwiegenden Fehler.

: CGContextSetStrokeColorWithColor: ungültiger Kontext 0x0. Diese ist ein schwerwiegender Fehler. Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet einen ungültigen Kontext und trägt damit zu einer Gesamtbetrachtung bei Verschlechterung der Systemstabilität und Zuverlässigkeit. Diese Mitteilung ist eine Höflichkeit: Bitte beheben Sie dieses Problem. Es wird ein schwerwiegender Fehler in einem kommendes Update.

CGContextSaveGState: ungültiger Kontext 0x0. Dies ist ein schwerwiegender Fehler . Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet einen ungültigen Kontext und trägt damit zu einer allgemeinen Verschlechterung des Systems bei Stabilität und Zuverlässigkeit. Dieser Hinweis ist eine Höflichkeit: Bitte beheben Sie das Problem. Bei einem anstehenden Update wird dies zu einem schwerwiegenden Fehler.

: CGContextSetFlatness: ungültiger Kontext 0x0. Dies ist ein ernstes Error. Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet ein ungültiges Kontext und trägt damit zu einer allgemeinen Verschlechterung von Systemstabilität und Zuverlässigkeit. Dieser Hinweis ist eine freundliche Genehmigung: bitte Beheben Sie dieses Problem. Bei einem anstehenden Update wird dies zu einem schwerwiegenden Fehler.

: CGContextAddPath: ungültiger Kontext 0x0. Dies ist ein ernstes Error. Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet ein ungültiges Kontext und trägt damit zu einer allgemeinen Verschlechterung von Systemstabilität und Zuverlässigkeit. Dieser Hinweis ist eine freundliche Genehmigung: bitte Beheben Sie dieses Problem. Bei einem anstehenden Update wird dies zu einem schwerwiegenden Fehler.

: CGContextDrawPath: Ungültiger Kontext 0x0. Dies ist ein ernstes Error. Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet ein ungültiges Kontext und trägt damit zu einer allgemeinen Verschlechterung von Systemstabilität und Zuverlässigkeit. Dieser Hinweis ist eine freundliche Genehmigung: bitte Beheben Sie dieses Problem. Bei einem anstehenden Update wird dies zu einem schwerwiegenden Fehler.

: CGContextRestoreGState: ungültiger Kontext 0x0. Das ist ein schwerwiegender Fehler Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet ein ungültiger Kontext und trägt damit zu einer allgemeinen Verschlechterung bei der Systemstabilität und Zuverlässigkeit. Dieser Hinweis ist eine freundliche Genehmigung: bitte Beheben Sie dieses Problem. Bei einem anstehenden Update wird dies zu einem schwerwiegenden Fehler.

: CGContextGetBlendMode: ungültiger Kontext 0x0. Dies ist ein ernstes Error. Diese Anwendung oder eine von ihr verwendete Bibliothek verwendet ein ungültiges Kontext und trägt damit zu einer allgemeinen Verschlechterung von Systemstabilität und Zuverlässigkeit. Dieser Hinweis ist eine freundliche Genehmigung: bitte Beheben Sie dieses Problem. Bei einem anstehenden Update wird dies zu einem schwerwiegenden Fehler.

Diese Fehler können auftreten, wenn eine benutzerdefinierte Ansicht oder eine der geerbten Klassen angezeigt wird. An diesem Punkt erscheinen sie mehrmals, bis die Tastatur keine Eingaben macht. Berührungsereignisse werden zwar weiterhin registriert, aber das System verlangsamt sich und kann schließlich zu nicht zugewiesenen Objektfehlern führen.

EDIT # 1: Ich habe Zugriff auf das zu importierende Framework, aber ich sehe keine seltsamen Elemente in den Klassen, die das Problem verursachen.

EDIT # 2: Ich habe gerade eine E-Mail erhalten, dass iOS 7.1 für Entwickler freigegeben wurde. Ich bin gespannt, ob das wegfällt oder schlimmer wird oder gelöst werden kann.

218
Ælex

Andere werden Sie auffordern, den Code an einem zentralen Grafikkontext zu veröffentlichen, aber ich bezweifle, dass dies der Fall ist. Diese ungültigen Kontext-0x0-Fehlermeldungen sind in iOS 7 üblich und einfach zu reproduzieren. Tatsächlich kann ich den Fehler mithilfe des Storyboards mit null Code reproduzieren. Ich ziehe ein UITextField auf die Leinwand in IB, führe die App aus und tippe zweimal in das Textfeld. 

In vielen Situationen ist es schwierig für mich, die ungültigen Kontext-0x0-Fehlermeldungen ernst zu nehmen. Ich weiß nicht, ob Ihre Situation größere Besorgnis erfordert (ich stimme mit Rob Napier überein, dass es eine Untersuchung wert ist, insbesondere wenn Sie explizit einen Grafikkontext verwenden).

In meinen eigenen Projekten hoffe ich, dass viele dieser Fehler eines Tages magisch verschwinden (aber dieser Tag kam nicht mit 7.0.3).

Update: Nach der Installation von Xcode 5.1 und dem Anzielen von iOS 7.1 kann ich den Fehler nicht mehr reproduzieren, indem ich in ein leeres Textfeld doppelt tippe. 

162
bilobatum

Wenn Sie wissen möchten, welcher Code diese Protokolle verursacht, können Sie einen symbolischen Haltepunkt hinzufügen bei CGPostError.

200
Art Gillespie

Diese Arten von Fehlern sind historisch das Ergebnis des Aufrufs von Core Graphics-Funktionen, wenn sie sich nicht innerhalb eines Kontextes befinden, der innerhalb von drawRect oder zwischen Aufrufen wie UIGraphicsBeginImageContext und UIGraphicsEndImageContext (oder anderen UIKit-Funktionen wie demjenigen, die erstellt wird) besteht einen Kontext beginnen und beenden).

Allerdings ist Bilobatum richtig, dass diese bestimmte Folge von Fehlern auf diesen iOS 7-Fehler zurückzuführen ist, auf den er in seiner Antwort verweist. Wenn diese Fehler nicht in Ihren iOS6-Zielen angezeigt werden oder wenn Sie nach einem kurzen Scan dieses privaten Frameworks keine verdächtigen Aufrufe von Core Graphics finden, liegt dies möglicherweise an diesem iOS 7-Fehler. Guter Fang, Bilobatum!

42
Rob
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

vergewissern Sie sich, dass size.width oder size.height nicht 0 ist. 

sie können CGPostError zur Überprüfung einen Symbolhaltepunkt hinzufügen

26
lbsweek

Ich hatte dieses Problem mit einem einfachen UITextField (Tastatur wird nicht angezeigt und viele verschiedene ungültige Kontextfehlermeldungen auf der Konsole) .. Ich finde nur eine Problemumgehung, indem ich ein anderes Problem in SO anschaue: Kann keine ausführbare Datei für CFBundle CertUIFramework finden. Achsschlaufe

Mach einfach:

klicken Sie auf iOS-Simulator> Inhalt und Einstellungen zurücksetzen ... und führen Sie den Vorgang erneut aus.

Das Problem sollte nicht mehr da sein

19
Kevin Delord

In meinem Fall habe ich folgende Fehler in diesem Code:

CAShapeLayer *shapeLayer = [CAShapeLayer layer];
UIBezierPath *path;

path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(0, 0)];
[path addLineToPoint:CGPointMake(size*2, 0)];
[path addLineToPoint:CGPointMake(size, size*2)];
[path closePath];
[path fill];

shapeLayer.path = path.CGPath;
shapeLayer.strokeColor = [[UIColor blackColor] CGColor];
shapeLayer.fillColor = color;
shapeLayer.lineWidth = width;

[self addSublayer:shapeLayer];

nach einigen Gedanken und Tests erkenne ich das Problem - es war dieser Aufruf:

[path fill];

wie ich feststelle - in meinem Code ist dieser Aufruf nicht notwendig, weil das Befüllen auf andere Weise erfolgt - also entferne ich ihn einfach.

16
Denis Kozhukhov

Gerade Antwort: Das Problem liegt darin, dass Sie Core-Grafikelemente wie CGContext usw. in einer anderen Methode als - (void)drawRect:(CGRect)rect verwendet haben.

Verschieben Sie nun Ihren Code zu dieser Methode. Und es wird abhauen und Ihnen Warnungen/Fehler geben.

5
user3693546

Ich hatte das gleiche Problem und ich habe vergessen, QuartzCore/QuartzCore.h zu importieren. Dies löste mein Problem mit diesen Fehlern.

    #import <QuartzCore/QuartzCore.h>
5
David Roop

Ich habe diesen Fehler erhalten, weil ich ein UIColor-Objekt als Attribut in einem NSAttributedString-Wörterbuch verwendet habe, das in einem CATextLayer-Objekt verwendet wurde. Ich habe das Wörterbuch geändert, um einen CGColorRef zu speichern, und der Fehler wurde behoben.

[wordAttributes setObject:(id)[UIColor whiteColor].CGColor forKey:(NSString*)kCTForegroundColorAttributeName];
4
Collin

Ich hatte Fälle, in denen der von UIGraphicsGetCurrentContext() zurückgegebene Kontext NULL ist und wenn Sie versuchen, ihn für irgendetwas zu verwenden, wird diese Meldung angezeigt. Es liegt in der Verantwortung der Ansicht, einen Kontext mithilfe von UIGraphicsPushContext vor dem Aufruf von drawRect: zu verschieben. Wenn Sie drawRect: direkt anstelle von [view setNeedsDisplay] aufrufen, riskieren Sie, dass der Kontext noch nicht festgelegt ist. Meine Vermutung ist, dass vor iOS 7 der Kontext für die Ansicht auf init gepusht wurde, und jetzt unter iOS 7 wird der Kontext nicht gepusht, bis drawRect: zum ersten Mal aufgerufen wird. Ich vermute, dass ein Teil des UIKit-Codes drawRect: direkt aufruft. Aus diesem Grund gibt es Probleme mit etwas Code, auch wenn keine benutzerdefinierte Zeichnung ausgeführt wird.

Lösungen (wenn Sie benutzerdefinierte Zeichnungen machen):

  1. Rufen Sie nicht drawRect: direkt an, verwenden Sie [view setNeedsDisplay] oder wenn Sie sofortiges Zeichnen benötigen, verwenden Sie [view.layer draw].
  2. In Ihrem drawRect: erhalten Sie den Kontext, verwenden Sie ihn jedoch nicht außerhalb des Rumpfes von if-Anweisung if (context) {<do drawing here>}.
2
jamone

In meinem Fall habe ich diese Warnung erhalten, als ich ein anpassbares Bild mit Cap-Einsätzen erstellte. Das Problem war, dass ich nicht mindestens 1 Pixel im "nicht gekappten" Bereich gelassen habe.

    UIImage *image = [UIImage imageNamed:@"name"];
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(20, 10, 20, 10);  //Problem here if the width is 20 or the height is 40
    image = [image resizableImageWithCapInsets:edgeInsets];
2
balkoth

Ich habe diesen Fehler in der drawInContext (..) -Methode meiner benutzerdefinierten CALayer-Implementierung erhalten. UIBezierPath versucht, UIGraphicsGetCurrentContext () zu verwenden, das in einer benutzerdefinierten Ebene standardmäßig null ist. Die Online-Dokumentation erklärt dies sehr deutlich - 

Wenn Sie jedoch kein UIView-Objekt zum Zeichnen verwenden, müssen Sie einen gültigen Kontext manuell mit der Funktion UIGraphicsPushContext auf den Stapel verschieben.

Hier ist der Code, der schließlich mit meinen Inline-Kommentaren funktionierte (Swift-Code, aber die Lösung ist trotzdem gleich)

override func drawInContext(ctx: CGContext!) {  
    var path = UIBezierPath()

    // 1. Make sure you Push the CGContext that was first passed into you.
    UIGraphicsPushContext(ctx)
    path.moveToPoint(CGPoint(x: 0, y: 0))
    path.addLineToPoint(CGPoint(x: 150, y: 150))
    var lineColor = UIColor.blueColor()
    lineColor.setStroke()
    path.lineWidth = 2
    path.stroke(
    // 2. Pop the context after you are done.
    UIGraphicsPopContext()
}
2
inder

In einigen Fällen müssen Sie möglicherweise die Zeile #import <QuartzCore/QuartzCore.h> angeben.

2
Nagarjun

Durch das Deaktivieren des automatischen Layouts in der betroffenen Ansicht wird dieser Fehler in einigen Fällen behoben, in denen Sie Benutzeroberflächenelemente (insbesondere benutzerdefinierte, programmgesteuert gezeichnete) Elemente in einer Ansicht platzieren und verschieben. Ich habe JVFloatLabeledTextField verwendet, als ich dieses Symptom entdeckte.

2
JuJoDi

Ich habe den Fehler mit dem Code erhalten

UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:pointA];
[path addLineToPoint:pointB];
[path addLineToPoint:pointC];
[[UIColor colorWithHexString:@"EFEFEF"] set];
[path fill];
[path closePath];

CAShapeLayer *triangle = [CAShapeLayer layer];
triangle.fillColor = [UIColor colorWithHexString:@"EFEFEF"].CGColor;
triangle.path = path.CGPath;

return triangle;

und nachdem der Code entfernt wurde

[[UIColor colorWithHexString:@"EFEFEF"] set];
[path fill];

Die Welt wurde still

1
wossoneri

Ich habe UIImage aus dem Kontext mit folgendem Code erstellt:

 UIGraphicsBeginImageContext (Größe); 
 CGContextRef context = UIGraphicsGetCurrentContext (); 

 CGContextSetFillColorWithColor (Kontext, Farbe.CGColor); 
 CGContextFillRect (Kontext, (CGRect) {. Size = size}); 

 UIImage * image = UIGraphicsGetImageFromCurrentImageContext (); 
 UIGraphicsEndImageContext (); 

So bekam ich den Fehler.

Also entfernte ich den Inhalt der abgeleiteten Daten und startete meinen XCode neu. Und es hat funktioniert.

1
Meet

Ich habe das gleiche Problem ... In meinem Projekt habe ich versucht, ein Textfeld zu erstellen und es meiner PDF-Datei hinzuzufügen.

- (void) drawInContext:(CGContextRef)context {
    //Otherwise we're upside-down
    CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0, 0.0, -1.0, 0.0, 0.0));

    CGContextSetTextDrawingMode(context, kCGTextFill); // This is the default
    [[UIColor blackColor] setFill]; // ***This is the problem ***

    CGFloat x = self.rect.Origin.x;
    CGFloat y = self.rect.Origin.y + self.font.pointSize;
    [self.text drawAtPoint:CGPointMake(x, y)
            withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Arial" size:12]}];
}

Nachdem dieses Problem behoben wurde, wurde der Code geändert:

old:[[UIColor blackColor] setFill]; 

new:CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]);

Ich habe die Lösung bei UIColor SetFill gefunden . Und danke dem Helfer.

1
Kate

Deinstallieren Sie die App vom Simulator und führen Sie sie erneut aus

0
Nagarjun

Ich habe diese Fehlermeldung erhalten, weil ich den CGContextRef freigegeben habe, wie unten gezeigt:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    // DRAW BACKGROUND CIRCLE
    CGContextSetFillColorWithColor(context, [[UIColor gray] colorWithAlphaComponent:0.6].CGColor);
    CGContextFillEllipseInRect(context, rect);

//    CGContextRelease(context);
}

Durch das Entfernen der Version wurde das Problem behoben

0
Kyle Redfearn

Wie andere, die hier kommentiert haben, erhielt ich diese Warnung, wenn ich Folgendes tat:

Auf einem leeren Textfeld: Doppeltippen, langes Tippen und längeres Antippen.

Dies scheint nur iOS 7.0.3 zu betreffen

Ich habe eine Problemumgehung entdeckt. Die Warnung wird nicht ausgelöst, wenn Ihr Pasteboard nicht NULL ist.

Also habe ich folgendes in textFieldDidBeginEditing gemacht:

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    if (pasteboard.string.length == 0) {

        pasteboard.string = @" ";

    }
}

Ich habe dies im Simulator für iOS 7.0.3 auf dem iPhone 4s, 5 und 5s getestet und erhalte keine Warnung mehr. Ich habe dies auch in Simulator für iOS 8 auf dem iPhone 6 und 6 plus getestet, aber ich glaube nicht, dass iOS 8 betroffen ist.

Habe zwei Tage der Enttäuschung durchgemacht, bevor ich diese Arbeit entdeckte. Ich hoffe also, dass meine Antwort denen von Ihnen hilft, die das gleiche Problem haben.

0
RS-232

Ich habe es bekommen, als ich den Bildnamen in der activityImage-Methode in der UIActivity-Unterklasse falsch geschrieben habe

- (UIImage *)activityImage
{
    return [UIImage imageNamed:@"img.png"];
}

Das richtige Bild einzugeben löste es für mich.

0
Saleh Albuga

Wenn der Fehler auftritt, wenn Sie UIBezierPath verwenden und die Farbe für den Strich oder die Füllung festlegen, setzen Sie den festgelegten Farbcode in die Funktion drawRect und nicht an andere Stellen.

0
Chuyang

Das ist hackig, aber es hat für mich funktioniert.

Ich setze UIImageView in UITableViewCell von init ein, gebe ihm eine Größe und Einschränkungen.

Dann mache ich in meinem View Controller cellForRowAtIndexPath folgendes:

let img = PFImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
img.setImage(withFile: nil, defaultText: message.senderUsername)
cell.profileImageView?.image = img.image

Und das vermeidet den Fehler, dann setze ich unterhalb der Funktion das eigentliche Bild für diesen UIImageView. Der obige Code ist ein guter Standard 

0
Zack Shapiro

Für mich war die Antwort, dass ich den Grafikkontext in drawRect: unnötig freigab. Einen symbolischen Haltepunkt auf CGPostError zu werfen, zeigte mir den Schuldigen. 

0
Taylor Halliday

Habe diesen Fehler wie ich eingestellt hatte 

textfield.delegate = self

Ohne das Implementieren von Delegierungsroutinen. Das Entfernen dieser Zeile löste das Problem für mich

0
Daniel Åkesson

Ich hatte dieses Problem in einem UITextField, als ich ein leeres Feld nur mit Platzhaltertext berührte. Ich habe die folgende Problemumgehung verwendet, um leere Felder zu entfernen:

-(void)textFieldDidBeginEditing:(UITextField *)textField{

        textField.text=[@" " stringByAppendingString:textField.text];

        //other stuff here
}


-(BOOL)textFieldShouldReturn:(UITextField *)textField{

         if(textField.text.length>0){
             if([[textField.text substringToIndex:1] isEqualToString:@" "])
                 textField.text=[textField.text substringFromIndex:1];
         }
         //  other stuff here
}
0
Peter B. Kramer