contesto 0x0 non valido in iOS 7.0 e degrado del sistema


218

Ho letto quanti più risultati di ricerca ho potuto trovare su questo temuto problema, sfortunatamente, ognuno sembra focalizzarsi su una specifica chiamata di funzione.

Il mio problema è che ottengo lo stesso errore da più funzioni, che suppongo vengano richiamate da funzioni che utilizzo.

A peggiorare le cose, il codice effettivo è all'interno di un framework privato personalizzato che viene importato in un altro progetto e, in quanto tale, il debug non è così semplice?

Qualcuno può indicarmi la giusta direzione? Ho la sensazione che sto chiamando alcuni metodi in modo errato o con un contesto negativo, ma l'output di xcode non è molto utile a questo punto.

: CGContextSetFillColorWithColor: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

: CGContextSetStrokeColorWithColor: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

CGContextSaveGState: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

: CGContextSetFlatness: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

: CGContextAddPath: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

: CGContextDrawPath: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

: CGContextRestoreGState: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

: CGContextGetBlendMode: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza utilizza un contesto non valido e contribuisce in tal modo a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: si prega di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

Tali errori possono verificarsi quando viene presentata una vista personalizzata o una delle sue classi ereditate. A quel punto si generano più volte, fino a quando la tastiera non fornisce alcun input. Gli eventi touch sono ancora registrati, ma il sistema rallenta e può eventualmente portare a errori di oggetto non allocati.

EDIT # 1: ho accesso al framework da importare, ma non vedo nulla di strano nelle classi che causano il problema.

EDIT # 2: ho appena ricevuto un'e-mail che iOS 7.1 è stato rilasciato per gli sviluppatori. Sono curioso di vedere se questo va via, o peggiora, o può essere risolto.


8
Otteniamo lo stesso errore nella nostra app: dalla casella di testo standard sul modulo. Se tocchi più volte la casella di testo mentre è visualizzata la tastiera, verrà visualizzato questo errore.

Anch'io. A volte centinaia di questi registri, a volte zero. Ho pensato che fosse perché sto scavalcando drawRect: ma sembra essere qualcos'altro. Ignorandolo per ora.
Krumelur,

2
Ho appena finito il primo tutorial su developer.apple.com (copiando il codice suggerito da Apple) e ottengo lo stesso errore. Può essere se i programmatori più esperti guardano quel tutorial che sono in grado di rintracciare la causa di questo problema.
Antonio Sesto,

1
Vedi sotto (disattiva il completamento automatico nelle viste in cui stai utilizzando gli elementi dell'interfaccia utente personalizzati)
JuJoDi

1
Succede ancora nel 2016 (XCode 7, iOS 9.2), ancora nessun danno apparente fatto.
Hatchmaster J

Risposte:


162

Altri ti chiederanno di pubblicare il codice in cui accedi a un contesto grafico principale, ma dubito che sia questo il problema. Questi messaggi di errore 0x0 di contesto non validi sono comuni e facili da riprodurre in iOS 7. In effetti, posso riprodurre l'errore utilizzando lo storyboard con codice zero. Trascino un UITextField nell'area di disegno in IB, eseguo l'app e tocco due volte all'interno del campo di testo.

In molte situazioni, è difficile per me prendere sul serio i messaggi di errore 0x0 del contesto non valido. Non so se la tua situazione meriti maggiore preoccupazione (concordo con Rob Napier sul fatto che valga la pena indagare, specialmente se stai usando esplicitamente un contesto grafico).

Nei miei progetti, spero che molti di questi errori scompaiano magicamente un giorno (ma quel giorno non è arrivato con 7.0.3).

Aggiornamento: dopo aver installato Xcode 5.1 e aver scelto come target iOS 7.1, non riesco più a riprodurre l'errore toccando due volte all'interno di un campo di testo vuoto.


10
Hai completamente ragione su questo bug di UITextField per iOS 7. Assicurati di aprire un radar per questo, però (bugreport.apple.com) Ma non essere troppo veloce per presumere che questo sia il problema qui. Dal momento che è una vista personalizzata, vale la pena prima investigare i punti di @ Rob.
Rob Napier,

2
Mi sta succedendo .. Lascio cadere un uitextfield su IB, ottengo quell'errore e la tastiera non appare .. c'è qualche soluzione ?? Grazie
Frade il

@Frade Per me, appare la tastiera e l'app funziona normalmente nonostante il messaggio di errore severo. Quindi potresti avere un ulteriore problema.
bilobatum,

3
Ho anche lo stesso problema. Succede anche solo nel simulatore, ma ho notato che, quando ricevo il bug, non posso usare la tastiera del Mac per digitare il simulatore e devo usare la tastiera su schermo, il che è molto frustrante. Nella mia app non utilizzo viste personalizzate, quindi non creo o uso mai manualmente un contesto CG.

1
Grazie al cielo, ho pensato che fosse colpa mia app! Hai perfettamente ragione però; è stato un doppio clic in un campo di testo che ha causato questo errore anche per me.
Ash,

201

Se siete curiosi di ciò che il codice sta causando questi registri, è possibile aggiungere un punto di interruzione simbolica su CGPostError.


2
Grazie per il suggerimento su CGPostError. Ho messo un punto di interruzione su di esso e sembra che non stia facendo nulla per causare questo problema. Nel mio caso sta accadendo sul thread principale ma non nel mio codice.
Paul Heller,

10
Votare questo perché, sebbene non sia la soluzione in questo caso specifico, spesso evidenzierà dove si trova l'errore, quando rientra nell'ambito del codice proprio del programmatore.
Ash,

27
Questo è un ottimo suggerimento. Per coloro che non hanno familiarità con i punti di interruzione simbolici o come aggiungerli in Xcode, ecco il documento di Apple a riguardo. developer.apple.com/library/ios/recipes/…
Tony Adams,

Questo mi ha aiutato. Nel mio caso ha evidenziato la mia aggiunta di un NSGradient a una vista sulla mia app OS X.
Aaron Vegh

1
Sembra che stavo disegnando prima di impostare una cornice per una certa vista, grazie! :)
Rick van der Linde,

42

Questi tipi di errori sono storicamente il risultato della chiamata alle funzioni Core Graphics quando non si trovano in un contesto stabilito all'interno drawRecto tra chiamate come UIGraphicsBeginImageContexte UIGraphicsEndImageContext(o altre funzioni UIKit come quelle che iniziano e terminano un contesto).

Detto questo, tuttavia, il bilobatum ha ragione nel dire che questa particolare sequenza di errori può essere il risultato di quel bug di iOS 7 a cui fa riferimento nella sua risposta. Se non vedi questi errori nei tuoi target iOS6, o se dopo una rapida scansione di questo framework privato non trovi alcuna chiamata Core Graphics sospetta, potrebbe trattarsi solo di questo bug di iOS 7. Buona cattura, bilobatum!


Ho una visione nel quadro privato che chiama drawRect. Mentre non sto chiamando direttamente nessuno dei metodi citati, la mia unica ipotesi è che il codice in quella classe sia in qualche modo correlato. Tuttavia, come ho già detto, tutto funziona senza intoppi con i precedenti iOS.
Ælex

Per motivi di completamento (questo è il miglior risultato di Google), vorrei notare che l'errore criptico è invariato su OSX 10.11.3 - e causato, come dice Rob, avendo una funzione di disegno al di fuori di drawRect o di un altro contesto- funzione correlata.
green_knight

26
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

assicurati che size.width o size.height non sia 0,

è possibile aggiungere il punto di interruzione del simbolo a CGPostError per verificare


quindi ... aggiungendo un punto di interruzione simbolico su CGPostError, come si può vedere la dimensione in quel punto?
Cris,

è possibile visualizzare lo stack di chiamate di funzione in "mostra la navigazione di debug" dal comando + 6. quindi fai clic sull'albero, quindi puoi tornare alla tua funzione per visualizzare la variabile.
lbsweek

Sì, stavo passando imageview per rendere circolare quella imagview, ma ho scoperto che la sua dimensione era zero. Finalmente è stato risolto dopo 2 giorni: D.
JiteshW

19

Ho avuto questo problema con un semplice UITextField (tastiera non visualizzata e molti diversi messaggi di errore di contesto non validi sulla console). Ho appena trovato una soluzione alternativa cercando un altro problema su SO: Impossibile trovare eseguibile per CFBundle CertUIFramework.axbundle

Basta fare:

fai clic su iOS Simulator> Ripristina contenuto e impostazioni ... ed esegui di nuovo.

Il problema non dovrebbe essere più lì


16

Nel mio caso ho questi errori in questo codice:

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

dopo alcuni pensieri e test rilevo il problema - era questa chiamata:

[path fill];

come ho rilevato - nel mio codice questa chiamata non è necessaria, poiché il riempimento verrà eseguito in altro modo - quindi lo rimuovo semplicemente.


5

Ho avuto lo stesso problema e ho dimenticato di importare QuartzCore / QuartzCore.h, questo ha risolto il mio problema con questi errori.

    #import <QuartzCore/QuartzCore.h>

5

Risposta diretta: il problema è dovuto al fatto che hai utilizzato elementi grafici Core come CGContext ecc. In - (void)drawRect:(CGRect)rectquesto metodo.

Ora sposta gentilmente il tuo codice in questo metodo. E si diffonderà dando avvertimenti / errori.


4

Stavo ottenendo questo errore perché stavo usando un oggetto UIColor come attributo in un dizionario NSAttributedString che veniva utilizzato in un oggetto CATextLayer. Ho cambiato il dizionario per contenere un CGColorRef e l'errore è andato via.

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

2

Ho avuto casi in cui il contesto tornato da UIGraphicsGetCurrentContext()è NULL, e se si tenta di utilizzare per qualsiasi cosa questo viene visualizzato il messaggio. È responsabilità della vista spingere un contesto usando UIGraphicsPushContextprima di chiamare drawRect:, se si chiama drawRect:direttamente invece di [view setNeedsDisplay]rischiare che il contesto non sia stato ancora impostato. Il mio sospetto è che prima di iOS 7 il contesto fosse spinto per la visualizzazione init, e ora su iOS 7 il contesto non è stato spinto fino a quando non drawRect:si sta per chiamare la prima volta . Sospetto che alcuni codici UIKit chiamino drawRect:direttamente ed è per questo che ci sono problemi con alcuni codici anche quando non viene eseguito alcun disegno personalizzato.

Soluzioni (se si esegue il disegno personalizzato):

  1. Non chiamare drawRect:direttamente, utilizzare [view setNeedsDisplay]o se è necessario un utilizzo immediato del disegno[view.layer draw]
  2. Nel tuo drawRect:ottenere il contesto, ma non usarlo al di fuori del corpo di questa istruzione ifif (context) {<do drawing here>}

2

La disattivazione del layout automatico nella vista interessata provoca la scomparsa di questo errore in alcuni casi in cui si posizionano e si spostano elementi dell'interfaccia utente (in particolare quelli personalizzati disegnati a livello di programmazione) all'interno di una vista. Stavo usando JVFloatLabeledTextField quando ho scoperto questo sintomo.


2

In alcuni casi potrebbe essere necessario includere la linea #import <QuartzCore/QuartzCore.h>.


2

Ho riscontrato questo errore nel metodo drawInContext (..) della mia implementazione CALayer personalizzata. UIBezierPath tenta di utilizzare UIGraphicsGetCurrentContext () che è nullo per impostazione predefinita in un livello personalizzato. La documentazione online lo spiega molto chiaramente:

Se non si utilizza un oggetto UIView per eseguire il disegno, tuttavia, è necessario inserire manualmente un contesto valido nello stack utilizzando la funzione UIGraphicsPushContext.

Ecco il codice che finalmente ha funzionato con i miei commenti in linea (codice Swift, ma la soluzione è la stessa a prescindere)

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

Nel mio caso stavo ricevendo questo avviso durante la creazione di un'immagine resible con inserti di protezione. Il problema era che non avrei lasciato almeno 1 pixel nell'area "non coperta".

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

1
Aveva esattamente lo stesso problema. Apparentemente devi lasciare almeno 1 punto dell'area in cui l'immagine può allungarsi
ribeto

1

Stavo creando UIImage dal contesto usando il codice seguente:

    UIGraphicsBeginImageContext (dimensioni);
    CGContextRef context = UIGraphicsGetCurrentContext ();

    CGContextSetFillColorWithColor (context, color.CGColor);
    CGContextFillRect (context, (CGRect) {. Size = size});

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

Quindi stavo ottenendo l'errore.

Quindi ho rimosso il contenuto dei dati derivati, riavviato il mio XCode. E ha funzionato.


Qual è la soluzione allora?
Geek,

1
@Geek, soluzione aggiornata. Rimuovere il contenuto DerivedData e riavviare.
Incontra il

1

Ho lo stesso problema. Nel mio progetto, ho provato a creare un textField e aggiungerlo al mio file pdf. Codice precedente:

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

Dopo aver risolto questo problema, il codice è cambiato:

old:[[UIColor blackColor] setFill]; 

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

Ho trovato la soluzione su UIColor SetFill non funziona . E grazie per l'aiuto.


1

Ho ricevuto l'errore con il codice

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;

e dopo aver rimosso il codice

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

Il mondo divenne silenzioso


0

Per me, la risposta è stata che stavo rilasciando inutilmente il contesto grafico drawRect:. Lanciare un punto di interruzione simbolico su CGPostError mi ha indicato il colpevole.


0

Ho ricevuto questo errore come avevo impostato

textfield.delegate = self

Senza implementare nessuna delle routine delegate. La rimozione di quella riga ha risolto il problema per me


0

Ho avuto questo problema in un UITextField quando ho tenuto il tocco su un campo vuoto con solo testo segnaposto. Ho usato la seguente soluzione alternativa per eliminare i campi vuoti:

-(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

Per me stavo ricevendo questo errore perché stavo rilasciando CGContextRef come mostrato di seguito:

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

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

//    CGContextRelease(context);
}

La rimozione della versione ha risolto il problema


0

Ho capito quando ho sbagliato a digitare il nome dell'immagine nel metodo activityImage nella sottoclasse UIActivity

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

Digitare l'immagine giusta l'ha risolto per me.


0

Disinstallare l'app dal simulatore ed eseguire di nuovo


0

Come altri che hanno commentato qui, ho ricevuto questo avviso quando ho eseguito una delle seguenti operazioni:

Su un campo di testo vuoto: tocca due volte, tocca e tieni premuto, tocco singolo lungo.

Questo sembra interessare solo iOS 7.0.3

Ho scoperto un problema, l'avviso non verrà attivato se il tuo cartone non è NULL.

Quindi ho fatto quanto segue in textFieldDidBeginEditing:

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

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

        pasteboard.string = @" ";

    }
}

Ho provato questo nel simulatore per iOS 7.0.3 su iPhone 4s, 5 e 5s e non ricevo più l'avviso. Ho anche provato questo nel simulatore per iOS 8 su iPhone 6 e 6 Plus, ma non credo che iOS 8 sia interessato.

Ho passato due giorni di frustrazione prima di scoprire questo lavoro in giro, quindi spero davvero che la mia risposta aiuti quelli di voi che hanno lo stesso problema.


0

Se l'errore si verifica quando si utilizza UIBezierPath e si imposta il colore per tratto o riempimento, inserire il codice colore impostato nella funzione drawRect anziché in altri punti.


0

Questo è confuso ma ha funzionato per me.

Ho impostato il UIImageViewin UITableViewCell's init, gli ho dato una dimensione e vincoli.

Quindi dal mio punto di vista controller cellForRowAtIndexPathfaccio questo:

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

E questo evita l'errore, quindi sotto quello nella funzione ho impostato l'immagine reale per quello UIImageView. Il codice sopra è un buon default

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.