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

218

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

Mi problema es que obtengo el mismo error de varias funciones, que supongo que se devuelven 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 señalarme en la dirección correcta? Tengo la sensación de que estoy llamando a ciertos métodos incorrectamente o con un contexto incorrecto, pero la salida 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 usa, está usando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que usa, está usando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que usa, está usando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que usa, está usando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, está utilizando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, está utilizando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, está utilizando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 no válido 0x0. Este es un error serio. Esta aplicación, o una biblioteca que utiliza, está utilizando un contexto no válido y, por lo tanto, está contribuyendo a una degradación general de la estabilidad y confiabilidad 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 se registran, pero el sistema se ralentiza y eventualmente puede conducir a errores de objetos no asignados.

EDITAR # 1: Tengo acceso al marco que se importa, pero no veo nada extraño en las clases que causen el problema.

EDITAR # 2: acabo de recibir un correo electrónico que iOS 7.1 ha sido lanzado para desarrolladores Tengo curiosidad por ver si esto desaparece, si empeora o si se puede resolver.

Ælex
fuente
8
Recibimos este mismo error en nuestra aplicación, desde el cuadro de texto estándar en el formulario. Si toca el cuadro de texto varias veces mientras se muestra el teclado, aparecerá este error.
Igual que aquí. A veces cientos de estos registros, a veces cero. Pensé que era porque estoy anulando drawRect: pero parece ser otra cosa. Ignorándolo por ahora.
Krumelur
2
Acabo de terminar el primer tutorial en developer.apple.com (copiando el código sugerido por Apple) y obtengo este mismo error. Puede ser si los programadores más experimentados miran ese tutorial y pueden rastrear la causa de este problema.
Antonio Sesto
1
Vea a continuación (desactive la distribución automática en las vistas donde está utilizando los elementos de la interfaz de usuario personalizados)
JuJoDi
1
Todavía sucede en 2016 (XCode 7, iOS 9.2), todavía no se ha hecho daño aparente.
Hatchmaster J

Respuestas:

162

Otros le pedirán que publique el código donde accede a un contexto gráfico central, pero dudo que ese sea el problema. Estos mensajes de error 0x0 de contexto no válidos son comunes y fáciles de reproducir en iOS 7. De hecho, puedo reproducir el error usando storyboard con código cero. Arrastro un UITextField sobre el lienzo en IB, ejecuto la aplicación y hago doble clic dentro del campo de texto.

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

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 apuntar a iOS 7.1, ya no puedo reproducir el error tocando dos veces dentro de un campo de texto vacío.

bilobatum
fuente
10
Tienes toda la razón sobre este error de iOS 7 UITextField. Sin embargo, asegúrese de abrir un radar (bugreport.apple.com) Pero no se apresure a suponer que ese es el problema aquí. Como es una vista personalizada, vale la pena investigar primero los puntos de @ Rob.
Rob Napier
2
Eso me está sucediendo ... Dejo caer un uitextfield en IB, obtengo ese error y el teclado no aparece ... ¿hay alguna solución? Gracias
Frade
@Frade Para mí, aparece el teclado y la aplicación se ejecuta normalmente a pesar del mensaje de error severo. Entonces puede tener un problema adicional.
bilobatum
3
También tengo el mismo problema. También solo ocurre en el simulador, pero noté que, cuando recibo el error, no puedo usar el teclado de Mac para escribir el simulador y tengo que usar el teclado en pantalla, lo cual es muy frustrante. En mi aplicación no estoy usando ninguna vista personalizada, por lo que nunca creo o uso manualmente un contexto CG.
1
Gracias a Dios por eso, ¡pensé que era mi aplicación la que tenía la culpa! Sin embargo, tienes toda la razón; fue hacer doble clic en un campo de texto que también me estaba causando este error.
Ash
201

Si tiene curiosidad sobre qué código está causando estos registros, puede agregar un punto de interrupción simbólicoCGPostError .

Art Gillespie
fuente
2
Gracias por el consejo sobre CGPostError. Puse un punto de interrupción y parece que no estoy haciendo nada para causar este problema. En mi caso, está sucediendo en el hilo principal pero no en mi código.
Paul Heller
10
Votar esto porque, aunque no es la solución en este caso específico, a menudo PODRÁ resaltar dónde está la falla, cuando está dentro del alcance del propio código del programador.
Ash
27
Esta es una gran sugerencia. Para aquellos que no están familiarizados con los puntos de interrupción simbólicos o cómo agregarlos en Xcode, aquí está el documento de Apple al respecto. developer.apple.com/library/ios/recipes/…
Tony Adams
Esto me ayudo. En mi caso, destacó que agregué un NSGradient a una vista en mi aplicación OS X.
Aaron Vegh
1
Parece que estaba dibujando antes de establecer un marco para una vista determinada, ¡gracias! :)
Rick van der Linde
42

Este tipo de errores son históricamente el resultado de llamar a funciones de Core Graphics cuando no están dentro de un contexto establecido dentro drawRecto entre llamadas como UIGraphicsBeginImageContexty UIGraphicsEndImageContext(u otras funciones UIKit como las que comienzan y terminan un contexto).

Dicho esto, sin embargo, bilobatum es correcto 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 objetivos iOS6, o si después de un escaneo rápido de este marco privado no encuentra ninguna llamada sospechosa de Core Graphics, puede ser este error de iOS 7. Buena captura, bilobatum!

Robar
fuente
Tengo una vista en el marco privado que llama a drawRect. Si bien no estoy llamando directamente a ninguno de los métodos mencionados, mi única suposición es que el código de esa clase está relacionado de alguna manera. Sin embargo, como mencioné, todo funciona sin problemas en iOS anteriores.
Ælex
En aras de la finalización (este es el principal resultado de Google), me gustaría señalar que el error críptico no ha cambiado en OSX 10.11.3, y causó, como dice Rob, tener una función de dibujo fuera de drawRect u otro contexto. función relacionada
green_knight
26
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

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

puede agregar un punto de interrupción de símbolo a CGPostError para verificar

lbsweek
fuente
entonces ... agregando un punto de interrupción simbólico en CGPostError, ¿cómo se puede ver el tamaño en ese punto?
Cris
puede ver la pila de llamadas de función en "mostrar la navegación de depuración" con el comando + 6. luego hace clic en el árbol, luego puede volver a su función para ver la variable.
lbsweek
Sí, estaba pasando la vista de imagen para hacer que esa imagen fuera circular, pero descubrí que su tamaño era cero. Finalmente se resolvió después de 2 días: D.
JiteshW
19

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

Solo haz:

haga clic en Simulador de iOS> Restablecer contenido y configuración ... y vuelva a ejecutarlo.

El problema ya no debería estar ahí

Kevin Delord
fuente
16

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 algunas reflexiones y pruebas, detecto el problema: fue esta llamada:

[path fill];

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

Denis Kozhukhov
fuente
5

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

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

Respuesta directa : El problema se debe a que ha utilizado elementos gráficos Core como CGContext, etc. en otro - (void)drawRect:(CGRect)rectmétodo que no sea este.

Ahora amablemente mueva su código a este método. Y se detendrá dándote advertencias / errores.


fuente
4

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

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

He tenido casos en los que el contexto regresó UIGraphicsGetCurrentContext()es NULL, y si intentas usarlo para algo, aparece este mensaje. Es responsabilidad de la vista impulsar un contexto utilizando UIGraphicsPushContextantes de llamar drawRect:, si llama drawRect:directamente en lugar de [view setNeedsDisplay]arriesgarse, el contexto aún no se ha configurado. Mi presentimiento es que antes de iOS 7, el contexto fue empujado para la vista init, y ahora en iOS 7 el contexto no se empuja hasta que la primera vez drawRect:está a punto de ser llamado. Sospecho que algún código UIKit está llamando drawRect:directamente y es por eso que hay problemas con algún código incluso cuando no se está haciendo un dibujo personalizado.

Soluciones (si está haciendo un dibujo personalizado):

  1. No llame drawRect:directamente, use [view setNeedsDisplay]o si necesita un uso inmediato del dibujo[view.layer draw]
  2. En su drawRect:obtener el contexto, pero no lo use fuera del cuerpo de esta declaración ifif (context) {<do drawing here>}
jamone
fuente
2

Desactivar la distribución automática en la vista afectada hace que este error desaparezca en algunos casos en los que coloca y mueve elementos de la IU (especialmente los personalizados que se dibujan mediante programación) dentro de una vista. Estaba usando JVFloatLa LabelTextField cuando descubrí este síntoma.

JuJoDi
fuente
2

En algunos casos, es posible que deba incluir la línea #import <QuartzCore/QuartzCore.h>.

Nagarjun
fuente
2

Recibí este error en el método drawInContext (..) de mi implementación personalizada de CALayer. UIBezierPath intenta usar 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 un contexto válido en la pila manualmente 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()
}
inder
fuente
2

En mi caso, tenía esta advertencia al crear una imagen resible con inserciones de tapa. El problema era que no dejaba al menos 1 píxel en el área "sin tapar".

    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];
balkoth
fuente
1
Tenía exactamente el mismo problema. Aparentemente tienes que dejar al menos 1 punto de área donde la imagen se puede estirar
ribeto
1

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

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

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

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

Por lo tanto, recibí el error.

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

Reunirse
fuente
Entonces, cual es la solución?
Geek
1
@ Geek, solución actualizada. Elimine el contenido de DerivedData y reinicie.
Conoce
1

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 al ayudante.

Kate
fuente
1

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 quitar el código

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

El mundo quedó en silencio

wossoneri
fuente
0

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

Taylor Halliday
fuente
0

Recibí este error como lo había configurado

textfield.delegate = self

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

Daniel Åkesson
fuente
0

Tuve este problema en un UITextField cuando mantuve el toque sobre un campo en blanco con solo texto de marcador de posición. Utilicé la siguiente solución para eliminar 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
}
Peter B. Kramer
fuente
0

Para mí, recibí este error porque estaba lanzando 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 la versión solucionó el problema

Kyle Redfearn
fuente
0

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

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

Escribir la imagen correcta lo resolvió para mí.

Saleh Albuga
fuente
0

Desinstale la aplicación del simulador y vuelva a ejecutar

Nagarjun
fuente
0

Al igual que otros que han comentado aquí, recibí esta advertencia cuando hice algo de lo siguiente:

En un campo de texto en blanco: toca dos veces, toca y mantén presionado, toca un botón largo.

Esto parece afectar solo a iOS 7.0.3

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

Entonces 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é dos días de frustración antes de descubrir esta solución, así que realmente espero que mi respuesta ayude a aquellos de ustedes que tienen el mismo problema.

RS-232
fuente
0

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

Chuyang
fuente
0

Esto es hacky pero funcionó para mí.

Configuré el UIImageViewen la UITableViewCell's init, le doy un tamaño y restricciones.

Luego, en mi controlador de vista, cellForRowAtIndexPathhago esto:

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

Y eso evita el error, luego debajo de eso en la función configuré la imagen real para eso UIImageView. El código anterior es un buen valor predeterminado

Zack Shapiro
fuente