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

218

Eu li o máximo de resultados de pesquisa que pude encontrar sobre esse problema, infelizmente, cada um parece se concentrar em uma chamada de função específica.

Meu problema é que eu recebo o mesmo erro de várias funções, que eu acho que estão sendo chamadas de volta a partir das funções que eu uso.

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

Alguém pode me indicar a direção certa? Sinto que estou chamando certos métodos incorretamente ou com um contexto ruim, mas a saída do xcode não é muito útil neste momento.

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

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

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

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

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

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

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

: CGContextGetBlendMode: contexto inválido 0x0. Isto é um erro sério. Esse aplicativo, ou uma biblioteca que ele usa, está usando um contexto inválido e, assim, contribui para uma degradação geral da estabilidade e confiabilidade do sistema. Este aviso é uma cortesia: corrija esse 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 classes herdadas. Nesse momento, eles aparecem várias vezes, até o teclado não fornecer nenhuma entrada. Os eventos de toque ainda são registrados, mas o sistema fica mais lento e, eventualmente, pode levar a erros de objetos não alocados.

EDIÇÃO # 1: Eu tenho acesso à estrutura sendo importada, mas não vejo nada de estranho nas classes que causam o problema.

EDIÇÃO # 2: Acabei de receber um e-mail informando que o iOS 7.1 foi lançado para desenvolvedores. Estou curioso para ver se isso desaparece ou piora ou pode ser resolvido.

Ælex
fonte
8
Recebemos esse mesmo erro em nosso aplicativo - na caixa de texto padrão no formulário. Se você tocar na caixa de texto várias vezes enquanto o teclado estiver mostrando, esse erro será exibido.
O mesmo aqui. Às vezes centenas desses logs, às vezes zero. Eu pensei que era porque eu estou substituindo drawRect: mas parece ser outra coisa. Ignorando isso por enquanto.
Krumelur 03/02
2
Acabei de terminar o primeiro tutorial em developer.apple.com (copiando o código sugerido pela Apple) e recebo o mesmo erro. Pode ser que, se programadores mais experientes analisarem o tutorial, eles conseguirão rastrear a causa desse problema.
Antonio Sesto
1
Veja abaixo (desligar autolayout nas vistas onde você está usando os elementos de interface do usuário personalizada)
JuJoDi
1
Ainda acontece em 2016 (XCode 7, iOS 9.2), ainda sem danos aparentes.
Hatchmaster J

Respostas:

162

Outros pedirão que você publique o código onde você acessa um contexto gráfico principal, mas duvido que esse seja o problema. Essas mensagens de erro de contexto 0x0 inválidas são comuns e fáceis de reproduzir no iOS 7. De fato, eu posso reproduzir o erro usando o storyboard com código zero. Arrasto um UITextField para a tela no IB, execute o aplicativo e toque duas vezes dentro do campo de texto.

Em muitas situações, é difícil para mim levar a sério as mensagens de erro de contexto 0x0 inválidas. Não sei se sua situação merece maior preocupação (concordo com Rob Napier que vale a pena investigar, especialmente se você estiver usando explicitamente 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.

bilobata
fonte
10
Você está completamente correto sobre esse bug do iOS 7 UITextField. Certifique-se de abrir um radar para isso (bugreport.apple.com). Mas não seja muito rápido em supor que esse é o problema aqui. Como é uma visão personalizada, vale a pena investigar os pontos de @ Rob.
Rob Napier
2
Isso está acontecendo comigo .. eu solto um campo uitext no IB, recebo esse erro e o teclado não aparece .. existe alguma solução ?? Obrigado
Frade
@Frade Para mim, o teclado aparece e o aplicativo é executado normalmente, apesar da mensagem de erro severa. Portanto, você pode ter um problema adicional.
bilobatum
3
Eu também tenho o mesmo problema. Isso também acontece apenas no simulador, mas notei que, quando estou recebendo o bug, não posso usar o teclado do Mac para digitar no simulador e preciso usar o teclado na tela, o que é muito frustrante. No meu aplicativo, não estou usando nenhuma visualização personalizada; portanto, nunca crio ou uso manualmente um contexto de CG.
1
Graças a Deus por isso, eu pensei que era o meu aplicativo que estava com defeito! Você está completamente certo; estava clicando duas vezes em um campo de texto que também estava causando esse erro.
Ash
201

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

Art Gillespie
fonte
2
Obrigado pela dica sobre CGPostError. Coloquei um ponto de interrupção nele e parece que não estou fazendo nada para causar esse problema. No meu caso, está acontecendo no thread principal, mas não no meu código.
Paul Heller
10
Votando, porque, embora não seja a solução nesse caso específico, muitas vezes destacará onde está a falha, quando estiver dentro do escopo do código do próprio programador.
Ash
27
Esta é uma ótima sugestão. Para aqueles que não estão familiarizados com pontos de interrupção simbólicos ou como adicioná-los no Xcode, aqui está o documento da Apple sobre isso. developer.apple.com/library/ios/recipes/...
Tony Adams
Isso me ajudou. No meu caso, destacou a adição de um NSGradient a uma exibição no meu aplicativo OS X.
precisa
1
Parece que eu estava desenhando antes de definir um quadro para uma certa visão, obrigado! :)
Rick van der Linde
42

Historicamente, esses tipos de erros são o resultado da chamada de funções dos Gráficos Principais quando não estão em um contexto estabelecido dentro drawRectou entre chamadas como UIGraphicsBeginImageContexteUIGraphicsEndImageContext (ou outras funções do UIKit como aquela que inicia e termina um contexto).

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

Roubar
fonte
Eu tenho uma visão na estrutura privada que chama drawRect. Enquanto eu não estou chamando diretamente nenhum dos métodos mencionados, minha única suposição é que o código nessa classe esteja de alguma forma relacionado. No entanto, como mencionei, tudo funciona sem problemas nos iOS anteriores.
Lexlex 7/11
Para fins de conclusão (este é o principal resultado do Google), gostaria de observar que o erro enigmático permanece inalterado no OSX 10.11.3 - e causado, como Rob diz, por ter uma função de desenho fora do drawRect ou outro contexto - função relacionada.
### green_knight #
26
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

verifique se size.width ou size.height não é 0,

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

lbsweek
fonte
então ... adicionando um ponto de interrupção simbólico no CGPostError, como se pode observar o tamanho nesse ponto?
Cris
você pode ver a pilha de chamadas de função em "show the debug navigation" pelo comando + 6. depois você clica na árvore e pode voltar à sua função para visualizar a variável.
lbsweek
Sim, eu estava passando a visualização de imagem para tornar essa visualização circular, mas descobri que o tamanho dele era zero. Finalmente foi resolvido após 2 dias: D.
JiteshW
19

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

Apenas faça:

clique no iOS Simulator> Redefinir conteúdo e configurações ... e execute novamente.

O problema não deveria estar mais lá

Kevin Delord
fonte
16

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 algumas reflexões e testes, detecto o problema - foi esta chamada:

[path fill];

como eu detecto - no meu código essa chamada não é necessária, porque o preenchimento será feito de outra maneira - então eu simplesmente o removo.

Denis Kozhukhov
fonte
5

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

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

Resposta direta: O problema é que você usou elementos gráficos do núcleo, como CGContext etc., além - (void)drawRect:(CGRect)rectdeste método.

Agora, mova seu código para esse método. E ele irá emitir avisos / erros.


fonte
4

Eu estava recebendo esse erro porque estava usando um objeto UIColor como um atributo em um dicionário NSAttributedString que estava sendo usado em um objeto CATextLayer. Mudei o dicionário para conter um CGColorRef e o erro desapareceu.

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

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

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

  1. Não ligue drawRect:diretamente, use [view setNeedsDisplay]ou se precisar de desenho imediato[view.layer draw]
  2. No seu drawRect:obter o contexto, mas não o use fora do corpo desta instrução ifif (context) {<do drawing here>}
jamone
fonte
2

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

JuJoDi
fonte
2

Em alguns casos, pode ser necessário incluir a linha #import <QuartzCore/QuartzCore.h>.

Nagarjun
fonte
2

Eu recebi esse erro no método drawInContext (..) da minha implementação personalizada do CALayer. UIBezierPath tenta usar o UIGraphicsGetCurrentContext () que é nulo por padrão em uma camada personalizada. A documentação online explica isso muito claramente -

Se você não estiver usando um objeto UIView para fazer seu desenho, no entanto, você deve enviar manualmente um contexto válido para a pilha usando a função UIGraphicsPushContext.

Aqui está o código que finalmente funcionou com meus comentários embutidos (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()
}
inder
fonte
2

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

    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
fonte
1
Tinha exatamente o mesmo problema. Aparentemente, você tem que deixar pelo menos 1 ponto da zona onde a imagem pode esticar
ribeto
1

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

    UIGraphicsBeginImageContext (tamanho);
    Contexto CGContextRef = UIGraphicsGetCurrentContext ();

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

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

Assim, eu estava recebendo o erro.

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

Conheçer
fonte
Qual é a solução então?
4144 Geek
1
@ Geek, solução atualizada. Remova o conteúdo DerivedData e reinicie.
Conheça
1

Eu tenho o mesmo problema. No meu projeto, tentei criar um campo de texto 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 resolver esse 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.

Kate
fonte
1

Eu 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 removido o código

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

O mundo ficou em silêncio

wossoneri
fonte
0

Para mim, a resposta foi que eu estava liberando desnecessariamente o contexto gráfico drawRect:. Jogar um ponto de interrupção simbólico no CGPostError me indicou o culpado.

Taylor Halliday
fonte
0

Recebi este erro como eu havia definido

textfield.delegate = self

Sem implementar nenhuma das rotinas de delegado. A remoção dessa linha resolveu o problema para mim

Daniel Åkesson
fonte
0

Eu tive esse problema em um UITextField quando toquei em um campo em branco com apenas o texto do espaço reservado. Usei a seguinte solução alternativa para eliminar os 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
}
Peter B. Kramer
fonte
0

Para mim, estava recebendo esse erro porque 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

Kyle Redfearn
fonte
0

Obtive quando digitei incorretamente o nome da imagem no método activityImage na subclasse UIActivity

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

Digitar a imagem certa resolveu isso para mim.

Saleh Albuga
fonte
0

Desinstale o aplicativo do simulador e execute novamente

Nagarjun
fonte
0

Como outros que comentaram aqui, eu recebia esse aviso quando fazia um dos seguintes:

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

Descobri uma solução alternativa, o aviso não será acionado se a área de transferência 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 = @" ";

    }
}

Testei isso no simulador para iOS 7.0.3 no iphone 4s, 5 e 5s e não recebo mais o aviso. 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.

Passamos dois dias de frustração antes de descobrir esse trabalho. Espero que minha resposta ajude aqueles que estão tendo o mesmo problema.

RS-232
fonte
0

Se o erro ocorrer quando você estiver usando o UIBezierPath e definir cores para traçado ou preenchimento, coloque o código de cores definido na função drawRect em vez de em outros locais.

Chuyang
fonte
0

Isso é hacky, mas funcionou para mim.

Eu configurei o UIImageViewno UITableViewCell's init, dou um tamanho e restrições.

Então, na minha view controller, cellForRowAtIndexPathfaço o seguinte:

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

E isso evita o erro, abaixo disso, na função, defino a imagem real para isso UIImageView. O código acima é um bom padrão

Zack Shapiro
fonte