contexto inválido 0x0 bajo iOS 7.0 y degradación del sistema

He leído todos los resultados de búsqueda que pude encontrar sobre este temido problema. Desafortunadamente, cada uno parece centrarse en una llamada de función específica.

Mi problema es que recibo el mismo error de varias funciones, que supongo que recibirán una llamada de las funciones que uso.

Para empeorar las cosas, el código real está dentro de un marco privado personalizado que se está importando en otro proyecto y, como tal, la depuración no es tan simple.

¿Alguien puede indicarme la dirección correcta? Tengo la sensación de que estoy llamando a ciertos métodos de forma incorrecta o con un contexto incorrecto, pero el resultado de xcode no es muy útil en este momento.

: CGContextSetFillColorWithColor: contexto no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

: CGContextSetStrokeColorWithColor: contexto inválido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

CGContextSaveGState: contexto inválido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

: CGContextSetFlatness: contexto inválido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

: CGContextAddPath: contexto inválido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

: CGContextDrawPath: contexto inválido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

: CGContextRestoreGState: contexto inválido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

: CGContextGetBlendMode: contexto inválido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y fiabilidad del sistema. Este aviso es una cortesía: solucione este problema. Se convertirá en un error fatal en una próxima actualización.

Esos errores pueden ocurrir cuando se presenta una vista personalizada o una de sus clases heredadas. En ese punto se generan varias veces, hasta que el teclado no proporcione ninguna entrada. Los eventos táctiles aún están registrados, pero el sistema se ralentiza y, finalmente, puede generar errores de objetos no asignados.

EDIT # 1: tengo acceso al marco que se está importando, pero no veo nada extraño en las clases que causa el problema.

EDIT # 2: Acabo de recibir un correo electrónico que indica que iOS 7.1 ha sido lanzado para desarrolladores. Tengo curiosidad por ver si esto desaparece, o empeora, o puede resolverse.

Otros le pedirán que publique el código donde accede a un contexto gráfico básico, pero dudo que ese sea el problema. Estos mensajes de error de contexto inválido 0x0 son comunes y fáciles de reproducir en iOS 7. De hecho, puedo reproducir el error usando el guión gráfico sin código. Arrastro un UITextField en el canvas en IB, ejecuto la aplicación y toco dos veces dentro del campo de texto.

En muchas situaciones, es difícil tomar en serio los mensajes de error de contexto 0x0. No sé si su situación justifica una mayor preocupación (estoy de acuerdo con Rob Napier en que vale la pena investigar, especialmente si está usando explícitamente un contexto de gráficos).

En mis propios proyectos, espero que muchos de estos errores desaparezcan mágicamente algún día (pero ese día no vino con 7.0.3).

Actualización: después de instalar Xcode 5.1 y dirigirme a iOS 7.1, ya no puedo reproducir el error tocando dos veces dentro de un campo de texto vacío.

Si tiene curiosidad por saber qué código está causando estos registros, puede agregar un punto de interrupción simbólico en CGPostError .

Este tipo de errores son históricamente el resultado de llamar a funciones de gráficos centrales cuando no están dentro de un contexto establecido en drawRect o entre llamadas como UIGraphicsBeginImageContext y UIGraphicsEndImageContext (u otras funciones de UIKit como la que inicia y finaliza un contexto).

Dicho esto, sin embargo, bilobatum tiene razón en que esta secuencia particular de errores puede ser el resultado de ese error de iOS 7 al que hace referencia en su respuesta. Si no ve estos errores en sus objectives iOS6, o si después de un escaneo rápido de este marco privado no encuentra ninguna llamada sospechosa de gráficos básicos, puede ser este error iOS 7. Buena captura, bilobatum!

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

asegúrese de que size.width o size.height no sea 0,

puede agregar un punto de corte de símbolo a CGPostError para verificar

Tuve este problema con un UITextField simple (el teclado no aparece y muchos mensajes de error de contexto diferentes en la consola). Acabo de encontrar una solución al buscar otro problema en SO: No se puede encontrar ejecutable para CFBundle CertUIFramework.axbundle

Solo haz:

haga clic en iOS Simulator> Restablecer contenido y configuración … y vuelva a ejecutar.

El problema ya no debería estar allí

En mi caso, tengo estos errores en este código:

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

después de algunos pensamientos y pruebas, detecto el problema, fue esta llamada:

 [path fill]; 

como lo detecto, en mi código, esta llamada no es necesaria porque el llenado se realizará de otra manera, así que simplemente lo elimino.

Tuve el mismo problema y olvidé importar QuartzCore / QuartzCore.h, esto resolvió mi problema con estos errores.

  #import  

Respuesta - (void)drawRect:(CGRect)rect : El problema se debe a que ha utilizado elementos de gráficos de Core como CGContext, etc. de otra manera que - (void)drawRect:(CGRect)rect este método.

Ahora mueva amablemente su código a este método. Y te dará advertencias / errores.

Estaba obteniendo este error porque estaba usando un objeto UIColor como un atributo en un diccionario NSAttributedString que se estaba utilizando en un objeto CATextLayer. Cambié el diccionario para contener un CGColorRef y el error desapareció.

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

He tenido casos en los que el contexto devuelto por UIGraphicsGetCurrentContext() es NULL , y si intentas usarlo para cualquier cosa, aparece este mensaje. Es responsabilidad de la vista insertar un contexto usando UIGraphicsPushContext antes de llamar a drawRect: si llama a drawRect: directamente en lugar de [view setNeedsDisplay] , corre el riesgo de que el contexto no se haya establecido aún. Mi corazonada es que antes de iOS 7 el contexto se presionó para la vista en init , y ahora en iOS 7 el contexto no se empuja hasta la primera vez que se va a llamar drawRect: Sospecho que algún código de UIKit está llamando a drawRect: directamente y esta es la razón por la cual hay problemas con algunos códigos incluso cuando no se está haciendo un dibujo personalizado.

Soluciones (si se realiza un dibujo personalizado):

  1. No llame a drawRect: directamente, use [view setNeedsDisplay] o si necesita un uso inmediato de dibujo [view.layer draw]
  2. En su drawRect: obtenga el contexto pero no lo use fuera del cuerpo de esta sentencia if (context) {}

Al desactivar el ajuste automático en la vista afectada, este error desaparece en algunos casos en los que está colocando y moviendo elementos de IU (especialmente los personalizados que se dibujan mediante progtwigción) dentro de una vista. Estaba usando JVFloatLabeledTextField cuando descubrí este síntoma.

En algunos casos, es posible que deba incluir la línea #import .

Obtuve este error en el método drawInContext (..) de mi implementación personalizada de CALayer. UIBezierPath intenta usar el UIGraphicsGetCurrentContext () que es nulo por defecto en una capa personalizada. La documentación en línea explica esto muy claramente:

Sin embargo, si no está utilizando un objeto UIView para hacer su dibujo, debe insertar manualmente un contexto válido en la stack utilizando la función UIGraphicsPushContext.

Aquí está el código que finalmente funcionó con mis comentarios en línea (código Swift, pero la solución es la misma independientemente)

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

En mi caso, tuve esta advertencia al crear una imagen resible con insertos de tapa. El problema era que no dejaba al menos 1 píxel en el área “sin capuchón”.

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

Estaba creando UIImage desde el contexto usando el siguiente código:

     UIGraphicsBeginImageContext (tamaño);
     CGContextRef context = UIGraphicsGetCurrentContext ();

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

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

Por lo tanto, estaba recibiendo el error.

Así que eliminé el contenido de Datos derivados, reinicié mi XCode. Y funcionó.

Tengo el mismo problema. En mi proyecto, he intentado crear un textField y agregarlo a mi archivo pdf. Código antiguo:

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

Después de resolver este problema, el código cambió:

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

Encontré que la solución en UIColor SetFill no funciona . Y gracias el ayudante.

Recibí el error con el código

 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; 

y después de eliminar el código

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

El mundo se silenció

Para mí, la respuesta fue que estaba liberando innecesariamente el contexto gráfico en drawRect: Al lanzar un punto de interrupción simbólico en CGPostError, me señaló al culpable.

Obtuve este error como lo había establecido

 textfield.delegate = self 

Sin implementar ninguna de las rutinas de delegado. Eliminar esa línea resolvió el problema para mí

Tuve este problema en un UITextField cuando mantuve el toque sobre un campo en blanco con solo el texto de marcador de posición. Usé la siguiente solución para eliminar los campos en blanco:

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

Para mí, estaba recibiendo este error porque estaba liberando el CGContextRef como se muestra a continuación:

 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); // DRAW BACKGROUND CIRCLE CGContextSetFillColorWithColor(context, [[UIColor gray] colorWithAlphaComponent:0.6].CGColor); CGContextFillEllipseInRect(context, rect); // CGContextRelease(context); } 

Eliminar el lanzamiento resolvió el problema

Lo obtuve cuando escribí mal el nombre de la imagen en el método activityImage en la subclase UIActivity

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

Escribir la imagen correcta lo resolvió para mí.

Desinstalar la aplicación del simulador y ejecutar nuevamente

Como otros que han comentado aquí recibí esta advertencia cuando hice alguno de los siguientes:

En un campo de texto en blanco: tocando dos veces, toque y mantenga presionada, toque largo solo.

Esto parece afectar solo iOS 7.0.3

Descubrí una solución, la advertencia no se activará si su pasteboard no es NULL.

Así que hice lo siguiente en textFieldDidBeginEditing:

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

Probé esto en el simulador para iOS 7.0.3 en el iPhone 4s, 5 y 5s y ya no recibo la advertencia. También probé esto en el simulador para iOS 8 en el iPhone 6 y 6 plus, pero no creo que iOS 8 se vea afectado.

Pasé por dos días de frustración antes de descubrir este trabajo, así que realmente espero que mi respuesta ayude a aquellos de ustedes que están teniendo el mismo problema.

Si el error ocurre cuando está usando UIBezierPath y establece el color para trazo o relleno, coloque el código de color establecido en la función drawRect en lugar de en otros lugares.