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

Ho letto tutti i risultati di ricerca che ho trovato su questo temuto problema, sfortunatamente, ognuno sembra concentrarsi su una specifica chiamata di funzione.

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

Per peggiorare le cose, il codice reale si trova all’interno di un framework privato personalizzato che viene importato in un altro progetto e, come 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 errato, 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo 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 così a un degrado complessivo della stabilità e dell’affidabilità del sistema. Questo avviso è una cortesia: ti preghiamo di risolvere questo problema. Diventerà un errore fatale in un prossimo aggiornamento.

Questi 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 fornirà alcun input. Gli eventi di touch sono ancora registrati, ma il sistema rallenta e alla fine può portare a errori di object non assegnati.

EDIT # 1: Ho accesso al framework che viene importato, 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.

Altri ti chiederanno di inserire il codice in cui accedi a un contesto grafico principale, ma dubito che questo sia 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 storyboard con codice zero. Trascino un UITextField sull’area di disegno in IB, eseguo l’app e tocca 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 maggiori preoccupazioni (sono d’accordo 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 il targeting per iOS 7.1, non riesco più a riprodurre l’errore toccando due volte all’interno di un campo di testo vuoto.

Se sei curioso di CGPostError quale codice sta causando questi log, puoi aggiungere un breakpoint simbolico su CGPostError .

Questi tipi di errori sono storicamente il risultato della chiamata delle funzioni della Core Graphics quando non sono all’interno di un contesto stabilito all’interno di drawRect o tra chiamate come UIGraphicsBeginImageContext e UIGraphicsEndImageContext (o altre funzioni UIKit come quella che inizia e termina un contesto).

Detto questo, però, bilobatum è corretto che questa particolare sequenza di errori possa essere il risultato di quel bug di iOS 7 che fa riferimento nella sua risposta. Se non vedi questi errori nei tuoi obiettivi iOS6, o se dopo una scansione veloce di questo framework privato non trovi alcuna chiamata Core Graphics sospetta, potrebbe essere solo questo bug di iOS 7. Buona presa, bilobatum!

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

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

è ansible aggiungere un punto di interruzione del simbolo a CGPostError per verificare

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

Basta fare:

fai clic su iOS Simulator> Reimposta contenuto e impostazioni … e corri di nuovo.

Il problema non dovrebbe essere più lì

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: è stata questa chiamata:

 [path fill]; 

come rilevo – nel mio codice questa chiamata non è necessaria, perché il riempimento verrà eseguito in altro modo – quindi lo rimuoverò semplicemente.

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

  #import  

Risposta diretta: il problema è dovuto al fatto che sono stati utilizzati elementi grafici di base come CGContext ecc in diversi da - (void)drawRect:(CGRect)rect questo metodo.

Ora sposta gentilmente il tuo codice su questo metodo. E sarà strop da darti avvertimenti / errori.

Stavo ricevendo questo errore perché stavo usando un object UIColor come attributo in un dizionario NSAttributedString che veniva usato in un object CATextLayer. Ho cambiato il dizionario per tenere un CGColorRef e l’errore è andato via.

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

Ho avuto casi in cui il contesto restituito da UIGraphicsGetCurrentContext() è NULL e se si tenta di utilizzarlo per qualsiasi cosa venga visualizzato questo messaggio. È responsabilità della vista spingere un contesto usando UIGraphicsPushContext prima di chiamare drawRect: UIGraphicsPushContext se chiamate drawRect: direttamente invece di [view setNeedsDisplay] si rischia che il contesto non sia ancora impostato. La mia impressione è che prima di iOS 7 il contesto fosse spinto per la vista su init , e ora su iOS 7 il contesto non è stato premuto fino alla prima volta drawRect: sta per essere chiamato. Sospetto che alcuni codici UIKit stiano chiamando drawRect: direttamente e questo è il motivo per cui 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, usa [view setNeedsDisplay] o se hai bisogno di disegni immediati usa [view.layer draw]
  2. Nel tuo drawRect: ottieni il contesto ma non usarlo al di fuori del corpo di questa istruzione if (context) {}

Distriggersndo l’autolayout nella vista interessata, questo errore scompare in alcuni casi in cui stai posizionando e spostando elementi dell’interfaccia utente (in particolare quelli personalizzati che vengono disegnati a livello di programmazione) all’interno di una vista. Stavo usando JVFloatLabeledTextField quando ho scoperto questo sintomo.

In alcuni casi potrebbe essere necessario includere la riga #import .

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

Se non si sta utilizzando un object 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() } 

Nel mio caso stavo avendo questo avvertimento quando creavo un’immagine resible con i cap insetti. Il problema era che non stavo lasciando almeno 1 pixel nell’area “non tappata”.

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

Stavo creando UIImage dal contesto usando il seguente codice:

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

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

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

Quindi stavo ottenendo l’errore.

Così ho rimosso il contenuto di Dati derivati, riavviato il mio XCode. E ha funzionato.

Ho lo stesso problema. Nel mio progetto, ho provato a creare un campo di testo e aggiungerlo al mio file pdf. Vecchio codice:

 - (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 che la soluzione di UIColor SetFill non funziona . E grazie l’aiuto.

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

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

Ho ricevuto questo errore come avevo impostato

 textfield.delegate = self 

Senza implementare alcuna routine delegata. La rimozione di questa linea ha risolto il problema per me

Ho avuto questo problema in un UITextField quando ho mantenuto il contatto su un campo vuoto con solo testo segnaposto. Ho usato il seguente work-around 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 } 

Per me ho ricevuto questo errore perché stavo rilasciando il 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 del rilascio ha risolto il problema

L’ho capito quando ho digitato male il nome dell’immagine nel metodo activityImage nella sottoclass UIActivity

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

Digitando l’immagine giusta l’ho risolto per me.

Disinstallare l’app dal simulatore ed eseguire di nuovo

Come altri che hanno commentato qui stavo ricevendo questo avvertimento quando ho fatto una delle seguenti azioni:

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

Questo sembra avere effetto solo su iOS 7.0.3

Ho scoperto un problema, l’avviso non verrà triggersto se il tuo pasteboard non è NULL.

Così ho fatto quanto segue in textFieldDidBeginEditing:

 - (void)textFieldDidBeginEditing:(UITextField *)textField { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; if (pasteboard.string.length == 0) { pasteboard.string = @" "; } } 

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

Sono passato attraverso due giorni di frustrazione prima di scoprire questo lavoro, quindi spero davvero che la mia risposta aiuti quelli di voi che stanno avendo lo stesso problema.

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