contexto inválido 0x0 no iOS 7.0 e degradação do sistema

Eu li tantos resultados de pesquisa que pude encontrar neste problema temido, infelizmente, cada um parece se concentrar em uma chamada de function específica.

Meu problema é que recebo o mesmo erro de várias funções, que, na minha opinião, estão sendo chamadas de funções que utilizo.

Para piorar, o código real está dentro de uma estrutura privada personalizada que está sendo importada em outro projeto e, como tal, a debugging não é tão simples?

Alguém pode me apontar para a direção certa? Tenho a sensação de que estou chamando determinados methods de maneira incorreta ou com contexto ruim, mas a saída do xcode não é muito útil neste momento.

: CGContextSetFillColorWithColor: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

: CGContextSetStrokeColorWithColor: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

CGContextSaveGState: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

: CGContextSetFlatness: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

: CGContextAddPath: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

: CGContextDrawPath: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

: CGContextRestoreGState: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

: CGContextGetBlendMode: contexto inválido 0 x 0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, portanto, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: por favor, corrija este problema. Isso se tornará um erro fatal em uma atualização futura.

Esses erros podem ocorrer quando uma exibição personalizada é apresentada ou uma de suas classs herdadas. Em que ponto eles desovam várias vezes, até que o teclado não forneça nenhuma input. Os events de toque ainda são registrados, mas o sistema fica lento e, eventualmente, pode levar a erros de object não alocados.

EDIT # 1: Eu tenho access ao framework que está sendo importado, mas não vejo nada de estranho nas classs que estão causando o problema.

EDIT # 2: Acabei de receber um email que o iOS 7.1 foi liberado para desenvolvedores. Estou curioso para ver se isso vai embora ou piorar, ou pode ser resolvido.

   

Outros lhe pedirão para postar o código onde você acessa um contexto gráfico principal, mas duvido que esse seja o problema. Essas mensagens inválidas de erro de contexto 0x0 são comuns e fáceis de reproduzir no iOS 7. Na verdade, posso reproduzir o erro usando o storyboard com código zero. Eu arrasto um UITextField para a canvas no IB, executo o aplicativo e bato duas vezes dentro do campo de texto.

Em muitas situações, é difícil para mim levar a sério as mensagens de erro de 0x0 do contexto inválido. Não sei se sua situação merece maior preocupação (concordo com Rob Napier que vale a pena investigar, especialmente se você estiver explicitamente usando um contexto gráfico).

Em meus próprios projetos, espero que muitos desses erros desapareçam magicamente algum dia (mas esse dia não veio com 7.0.3).

Atualização: Depois de instalar o Xcode 5.1 e direcionar o iOS 7.1, não consigo mais reproduzir o erro tocando duas vezes dentro de um campo de texto vazio.

Se você está curioso para saber qual código está causando esses logs, você pode adicionar um ponto de interrupção simbólico em CGPostError .

Esses tipos de erros são historicamente o resultado da chamada de funções do Core Graphics quando não dentro de um contexto estabelecido dentro de drawRect ou entre chamadas como UIGraphicsBeginImageContext e UIGraphicsEndImageContext (ou outras funções do UIKit como aquelas que iniciam e terminam um contexto).

Dito isto, no entanto, o bilobatum está correto em dizer que essa seqüência específica de erros pode ser resultado daquele bug do iOS 7 que ele menciona em sua resposta. Se você não estiver vendo esses erros em seus alvos do iOS6, ou se, após uma verificação rápida dessa estrutura privada, você não encontrar nenhuma chamada de Core Graphics suspeita, pode ser apenas esse bug do iOS 7. Boa pegada, bilobatum!

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

certifique-se de que o size.width ou size.height não é 0,

você pode adicionar ponto de interrupção de símbolo a CGPostError para verificar

Eu tive esse problema com um simples UITextField (teclado não aparecendo e muitos diferentes mensagens de erro de contexto inválido no console). Acabei de encontrar uma solução, olhando para outro problema em SO: Não é possível encontrar executável para CFBundle CertUIFramework.axbundle

Apenas faça:

clique em Simulador do iOS> Redefinir conteúdo e configurações … e execute novamente.

O problema não deveria estar mais lá

No meu caso eu tenho esses erros neste 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]; 

depois de alguns pensamentos e teste eu detecto o problema – foi esta chamada:

 [path fill]; 

como eu detecto – no meu código esta chamada não é necessária, porque o preenchimento será feito por outro caminho – então eu simplesmente removê-lo.

Eu tive esse mesmo problema e esqueci de importar o QuartzCore / QuartzCore.h, isso resolveu meu problema com esses erros.

  #import  

Resposta direta: O problema é que você usou elementos charts do Core como o CGContext etc em outro que - (void)drawRect:(CGRect)rect este método.

Agora gentilmente mova seu código para este método. E ele irá distribuir avisos ou erros.

Eu estava recebendo esse erro porque eu estava usando um object UIColor como um atributo em um dictionary NSAttributedString que estava sendo usado em um object CATextLayer. Eu mudei o dictionary para segurar um CGColorRef e o erro foi embora.

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

Eu tive casos em que o contexto retornado de UIGraphicsGetCurrentContext() é NULL , e se você tentar usá-lo para qualquer coisa, esta mensagem aparecerá. É responsabilidade da visão empurrar um contexto usando UIGraphicsPushContext antes de chamar UIGraphicsPushContext se você chamar drawRect: diretamente em vez de [view setNeedsDisplay] você arrisca que o contexto ainda não esteja definido. Meu palpite é que antes do iOS 7 o contexto era empurrado para a visualização no init , e agora no iOS 7 o contexto não é pressionado até a primeira vez que drawRect: está prestes a ser chamado. Eu suspeito que algum código UIKit esteja chamando drawRect: diretamente e é por isso que existem problemas com algum código, mesmo quando nenhum desenho personalizado está sendo feito.

Soluções (se fazendo um desenho personalizado):

  1. Não chame drawRect: diretamente, use [view setNeedsDisplay] ou se você precisar usar o desenho imediatamente [view.layer draw]
  2. Em seu drawRect: obtenha o contexto mas não o use fora do corpo desta declaração if (context) {}

Desativar o autolayout na exibição afetada faz com que esse erro desapareça em alguns casos em que você está colocando e movendo elementos da interface do usuário (especialmente os personalizados que são desenhados programaticamente) dentro de uma exibição. Eu estava usando JVFloatLabeledTextField quando descobri esse sintoma.

Em alguns casos, você pode precisar include a linha #import .

Eu tenho esse erro no método drawInContext (..) da minha implementação de CALayer personalizado. UIBezierPath tenta usar o UIGraphicsGetCurrentContext (), que é nulo por padrão em uma camada personalizada. A documentação on-line explica isso com muita clareza –

Se você não estiver usando um object UIView para fazer seu desenho, no entanto, você deve empurrar um contexto válido para a pilha manualmente usando a function UIGraphicsPushContext.

Aqui está o código que finalmente funcionou com meus comentários em linha (código Swift, mas a solução é a mesma, independentemente)

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

No meu caso, eu estava tendo esse aviso ao criar uma imagem resible com inserções de limite. O problema era que eu não estava deixando pelo menos 1 pixel na área “destampada”.

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

Eu estava criando o UIImage a partir do contexto usando o código abaixo:

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

     CGContextSetFillColorWithColor (context, color.CGColor);
     CGContextFillRect (contexto, (CGRect) {. Tamanho = tamanho});

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

Assim eu estava recebendo o erro.

Então eu removi o conteúdo dos dados derivados, reiniciei o meu XCode. E funcionou.

Eu tenho o mesmo problema. No meu projeto, eu tentei criar um textField e adicioná-lo ao meu arquivo pdf. Código antigo:

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

Depois de resolvido este problema, o código mudou:

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

Eu encontrei a solução no UIColor SetFill não funciona . E obrigado o ajudante.

Recebi o erro com o 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; 

e depois de removido o código

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

O mundo ficou em silêncio

Para mim, a resposta foi que eu estava liberando desnecessariamente o contexto gráfico no drawRect: Lançar um breakpoint simbólico no CGPostError me indicou o culpado.

Tenho esse erro como eu tinha definido

 textfield.delegate = self 

Sem implementar qualquer uma das rotinas de delegado. Remover essa linha resolveu o problema para mim

Eu tive esse problema em um UITextField quando eu segurei o toque em um campo em branco com apenas texto de espaço reservado. Usei a solução alternativa a seguir para eliminar campos em branco:

 -(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 mim eu estava recebendo este erro porque eu estava liberando o CGContextRef como mostrado abaixo:

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

A remoção da versão resolveu o problema

Eu peguei quando eu digitei errado o nome da imagem no método activityImage na subclass UIActivity

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

Digitar a imagem certa resolveu para mim.

Desinstale o aplicativo do simulador e execute novamente

Como outros que comentaram aqui, recebi este aviso quando fiz o seguinte:

Em um campo de texto em branco: toque duas vezes, toque e segure, toque longo e único.

Isso parece afetar apenas o iOS 7.0.3

Eu descobri um trabalho em volta, o aviso não será acionado se o seu pasteboard não for NULL.

Então fiz o seguinte em textFieldDidBeginEditing:

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

Eu testei isso no simulador para iOS 7.0.3 nos iphone 4s, 5 e 5s e não recebi mais o aviso. Eu também testei isso no simulador para iOS 8 no iPhone 6 e 6 plus, mas não acredito que o iOS 8 seja afetado.

Passou dois dias de frustração antes de descobrir este trabalho, então eu realmente espero que minha resposta ajude aqueles de vocês que estão tendo o mesmo problema.

Se o erro ocorrer quando você estiver usando o UIBezierPath e definir a cor para traço ou preenchimento, coloque o código de colors definido na function drawRect em vez de em outros lugares.