objective-c - framework - objective c documentation
contexto inválido 0x0 bajo iOS 7.0 y degradación del sistema (26)
He leído tantos resultados de búsqueda que pude encontrar sobre este temido problema, aunque lamentablemente, 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 se están recuperando 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 incorrectamente a ciertos métodos 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 utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y confiabilidad del sistema. Este aviso es una cortesía: por favor 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 utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y confiabilidad del sistema. Este aviso es una cortesía: por favor 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 utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y confiabilidad del sistema. Este aviso es una cortesía: por favor 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 utiliza, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y confiabilidad del sistema. Este aviso es una cortesía: por favor 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 confiabilidad del sistema. Este aviso es una cortesía: por favor 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 confiabilidad del sistema. Este aviso es una cortesía: por favor 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, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y confiabilidad del sistema. Este aviso es una cortesía: por favor 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, utiliza un contexto no válido y, por lo tanto, contribuye a una degradación general de la estabilidad y confiabilidad del sistema. Este aviso es una cortesía: por favor 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 múltiples veces, hasta que el teclado no proporciona ninguna entrada. Los eventos táctiles todavía se registran, pero el sistema se ralentiza y, en última instancia, puede dar lugar a errores de objetos no asignados.
EDICIÓN # 1: Tengo acceso al marco que se está importando, pero no veo nada extraño en las clases que causan 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, empeora o puede resolverse.
Al igual que otros que han comentado aquí, recibí esta advertencia cuando hice cualquiera de los siguientes:
En un campo de texto en blanco: toque doble, toque y mantenga presionado, toque largo y simple.
Esto parece afectar solo a iOS 7.0.3
Descubrí una solución alternativa, la advertencia no se activará si su tablero de trabajo 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 esté 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 tienen el mismo problema.
Conseguí este error como lo había establecido.
textfield.delegate = self
Sin implementar ninguna de las rutinas de delegado. Eliminar esa línea me solucionó el problema
Desinstala la aplicación del simulador y ejecuta otra vez.
En algunos casos, es posible que deba incluir la línea #import <QuartzCore/QuartzCore.h>
.
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, detecté el problema: era esta llamada:
[path fill];
Como detecto, en mi código esta llamada no es necesaria, ya que el llenado se realizará de otra manera, así que simplemente lo elimino.
En mi caso, estaba teniendo esta advertencia al crear una imagen resible con inserciones de tapa. El problema era que no estaba dejando 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];
Estaba creando UIImage desde el contexto usando el siguiente código:
UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, color.CGColor); CGContextFillRect(context, (CGRect){.size = size}); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
Así me fue llegando el error.
Así que quité el contenido de Datos Derivados, reinicié mi XCode. Y funcionó.
Este tipo de errores son históricamente el resultado de llamar a las funciones Core Graphics cuando no están dentro de un contexto que se establece dentro de drawRect
o entre llamadas como UIGraphicsBeginImageContext
y UIGraphicsEndImageContext
(u otras funciones de UIKit como la que comienza y termina un contexto).
Sin embargo, dicho esto, el bilobatum está en lo correcto de 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 de iOS6, o si después de un análisis rápido de este marco privado no encuentra ninguna llamada sospechosa de Core Graphics, puede que solo sea este error de iOS 7. Buena captura, bilobatum!
Esto es hacky pero funcionó para mí.
Configuré el UIImageView
en el init
UITableViewCell
, le doy un tamaño y restricciones.
Luego, en mi punto de vista, el controlador cellForRowAtIndexPath
hago 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 configuro la imagen real para ese UIImageView
. El código de arriba es un buen predeterminado
He tenido casos en los que el contexto devuelto por UIGraphicsGetCurrentContext()
es NULL
, y si intenta usarlo para cualquier cosa, aparece este mensaje. Es responsabilidad de la vista empujar un contexto usando UIGraphicsPushContext
antes de llamar a drawRect:
si llama a drawRect:
directamente en lugar de [view setNeedsDisplay]
se arriesga a que el contexto no se establezca todavía. Mi corazonada es que antes de iOS 7, el contexto fue empujado para la vista en init
, y ahora en iOS 7 el contexto no es empujado hasta la primera vez que 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 algunos códigos incluso cuando no se está haciendo un dibujo personalizado.
Soluciones (en caso de hacer dibujos personalizados):
- No llames a
drawRect:
directamente, usa[view setNeedsDisplay]
o si necesitas un dibujo inmediato usa[view.layer draw]
- En su
drawRect:
obtenga el contexto pero no lo use fuera del cuerpo de esta declaraciónif (context) {<do drawing here>}
La desactivación de la reproducció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 JVFloatLabeledTextField cuando descubrí este síntoma.
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"];
}
Escribiendo la imagen correcta me lo resolvió.
Me ha llegado el error con el codigo
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 despues quitado el codigo
[[UIColor colorWithHexString:@"EFEFEF"] set];
[path fill];
El mundo se volvió silencioso.
Otros te pedirán que publiques el código donde accedes a un contexto de gráficos centrales, pero dudo que ese sea el problema. Estos mensajes de error de contexto 0x0 no válidos son comunes y fáciles de reproducir en iOS 7. De hecho, puedo reproducir el error utilizando el guión gráfico con código cero. Arrastro un UITextField al lienzo en IB, ejecuto la aplicación y pulso dos veces dentro del campo de texto.
En muchas situaciones, es difícil para mí tomar en serio los mensajes de error de contexto 0x0 no válidos. No sé si su situación merece mayor preocupación (estoy de acuerdo con Rob Napier en que vale la pena investigar, especialmente si está utilizando 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 apuntar a iOS 7.1, ya no puedo reproducir el error al tocar dos veces dentro de un campo de texto vacío.
Para mí estaba recibiendo 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);
}
Eliminando el lanzamiento se solucionó el problema.
Para mí, la respuesta fue que estaba liberando innecesariamente el contexto de gráficos en drawRect:
Lanzar un punto de ruptura simbólico en CGPostError me señaló al culpable.
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 lo explica 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()
}
Recibía este error porque estaba usando un objeto UIColor como un atributo en un diccionario NSAttributedString que estaba siendo usado en un objeto CATextLayer. Cambié el diccionario para mantener un CGColorRef y el error desapareció.
[wordAttributes setObject:(id)[UIColor whiteColor].CGColor forKey:(NSString*)kCTForegroundColorAttributeName];
Si el error se produce cuando utiliza UIBezierPath y configura el color para trazo o relleno, coloque el código de color establecido en la función drawRect en lugar de otros lugares.
Tengo el mismo problema. En mi proyecto, he intentado crear un campo de texto 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.
Tuve este mismo problema y olvidé importar QuartzCore / QuartzCore.h, esto resolvió mi problema con estos errores.
#import <QuartzCore/QuartzCore.h>
Tuve este problema con un simple UITextField (el teclado no aparece y muchos mensajes de error de contexto no válido en la consola). Acabo de encontrar una solución 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 ejecutar.
El problema ya no debería estar ahí.
Tuve este problema en un UITextField cuando mantuve el toque sobre un campo en blanco con solo el texto del 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
}
Respuesta - (void)drawRect:(CGRect)rect
: el problema se debe a que ha utilizado elementos gráficos Core como CGContext, etc., que no sean - (void)drawRect:(CGRect)rect
este método.
Ahora amablemente mueva su código a este método. Y se detendrá dando advertencias / errores.
Si tiene curiosidad sobre qué código está causando estos registros, puede agregar un punto de interrupción simbólico en CGPostError
.
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();
asegúrese de que size.width o size.height no sea 0,
puede agregar el punto de interrupción del símbolo a CGPostError para verificar