web-dev-qa-db-fra.com

contexte invalide 0x0 sous iOS 7.0 et dégradation du système

J'ai lu autant de résultats de recherche que j'ai pu trouver sur ce problème redoutable, malheureusement, chacun d'eux semble se concentrer sur un appel de fonction spécifique.

Mon problème est que je reçois la même erreur de plusieurs fonctions, qui, je suppose, sont rappelées par des fonctions que j'utilise.

Pour aggraver les choses, le code lui-même se trouve dans un cadre privé personnalisé importé dans un autre projet et, en tant que tel, le débogage n'est pas aussi simple.

Quelqu'un peut-il m'indiquer la bonne direction? J'ai l'impression d'appeler certaines méthodes à tort ou avec un mauvais contexte, mais la sortie de xcode n'est pas très utile à ce stade.

: CGContextSetFillColorWithColor: contexte invalide 0x0. C'est une erreur grave. Cette application, ou une bibliothèque qu’elle utilise, utilise un fichier contexte invalide et contribue ainsi à une dégradation globale de la stabilité et de la fiabilité du système. Cet avis est une courtoisie: s'il vous plaît résoudre ce problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

: CGContextSetStrokeColorWithColor: contexte invalide 0x0. Ce est une erreur grave. Cette application, ou une bibliothèque qu’elle utilise, utilise un contexte invalide et contribue ainsi à une globale. dégradation de la stabilité et de la fiabilité du système. Cet avis est un courtoisie: s'il vous plaît résoudre ce problème. Cela deviendra une erreur fatale dans un mise à jour à venir.

CGContextSaveGState: contexte invalide 0x0. C'est une erreur sérieuse. Cette application, ou une bibliothèque qu'elle utilise, utilise un contexte non valide et contribue ainsi à la dégradation globale du système stabilité et fiabilité. Cet avis est une courtoisie: veuillez corriger ceci problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

: CGContextSetFlatness: contexte invalide 0x0. C'est un sérieux Erreur. Cette application, ou une bibliothèque qu'elle utilise, utilise un .__ invalide. contexte et contribue ainsi à une dégradation globale de stabilité et fiabilité du système. Cet avis est une courtoisie: s'il vous plaît résoudre ce problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

: CGContextAddPath: contexte invalide 0x0. C'est un sérieux Erreur. Cette application, ou une bibliothèque qu'elle utilise, utilise un .__ invalide. contexte et contribue ainsi à une dégradation globale de stabilité et fiabilité du système. Cet avis est une courtoisie: s'il vous plaît résoudre ce problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

: CGContextDrawPath: contexte non valide 0x0. C'est un sérieux Erreur. Cette application, ou une bibliothèque qu'elle utilise, utilise un .__ invalide. contexte et contribue ainsi à une dégradation globale de stabilité et fiabilité du système. Cet avis est une courtoisie: s'il vous plaît résoudre ce problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

: CGContextRestoreGState: contexte invalide 0x0. C'est un erreur grave. Cette application, ou une bibliothèque qu’elle utilise, utilise un fichier contexte invalide et contribue ainsi à une dégradation globale de la stabilité et de la fiabilité du système. Cet avis est une courtoisie: s'il vous plaît résoudre ce problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

: CGContextGetBlendMode: contexte invalide 0x0. C'est un sérieux Erreur. Cette application, ou une bibliothèque qu'elle utilise, utilise un .__ invalide. contexte et contribue ainsi à une dégradation globale de stabilité et fiabilité du système. Cet avis est une courtoisie: s'il vous plaît résoudre ce problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

Ces erreurs peuvent survenir lors de la présentation d'une vue personnalisée ou de l'une de ses classes héritées. À quel moment ils apparaissent plusieurs fois, jusqu'à ce que le clavier ne fournisse aucune entrée. Les événements tactiles sont toujours enregistrés, mais le système ralentit et peut éventuellement conduire à des erreurs d'objet non allouées.

EDIT # 1: J'ai accès au framework importé, mais je ne vois rien d’étrange dans les classes qui cause le problème.

EDIT # 2: Je viens de recevoir un email l'informant que iOS 7.1 a été publié pour les développeurs. Je suis curieux de voir si cela disparaît, s’aggrave ou s’il peut être résolu.

218
Ælex

D'autres vous demanderont de poster le code lorsque vous accédez à un contexte graphique de base, mais je doute que ce soit le problème. Ces messages d'erreur de contexte 0x0 non valides sont courants et faciles à reproduire dans iOS 7. En fait, je peux reproduire l'erreur à l'aide du storyboard avec zéro code. Je fais glisser un UITextField sur le canevas de IB, lance l'application et double-tape à l'intérieur du champ de texte. 

Dans de nombreuses situations, il m'est difficile de prendre au sérieux les messages d'erreur de contexte 0x0 non valides. Je ne sais pas si votre situation mérite plus d'inquiétude (je conviens avec Rob Napier qu'il vaut la peine d'enquêter, en particulier si vous utilisez explicitement un contexte graphique).

Dans mes propres projets, j'espère que bon nombre de ces erreurs disparaîtront comme par magie un jour (mais ce jour-là n'est pas venu avec la version 7.0.3).

Mise à jour: Après avoir installé Xcode 5.1 et ciblé iOS 7.1, je ne peux plus reproduire l'erreur en appuyant deux fois dans un champ de texte vide. 

162
bilobatum

Si vous êtes curieux de savoir quel code est à l'origine de ces journaux, vous pouvez ajouter un point d'arrêt symbolique sur CGPostError.

200
Art Gillespie

Historiquement, ces types d’erreurs résultent de l’appel de fonctions Core Graphics lorsque le contexte n’est pas défini dans drawRect ou entre des appels tels que UIGraphicsBeginImageContext et UIGraphicsEndImageContext (ou d’autres fonctions UIKit telles que celle qui existe. commencer et terminer un contexte).

Cela dit, bilobatum a toutefois raison de dire que cette séquence d’erreurs peut être le résultat du bogue d’iOS 7 qu’il a mentionné dans sa réponse. Si vous ne voyez pas ces erreurs dans vos cibles iOS6 ou si, après une analyse rapide de ce cadre privé, vous ne trouvez aucun appel suspect de Core Graphics, il se peut qu'il s'agisse simplement de ce bogue iOS 7. Bonne prise, bilobatum!

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

assurez-vous que size.width ou size.height n'est pas égal à 0, 

vous pouvez ajouter un point d'arrêt de symbole à CGPostError pour vérifier

26
lbsweek

J'ai eu ce problème avec un simple UITextField (clavier ne s'affiche pas et de nombreux messages d'erreur de contexte non valide sur la console) . Je viens de trouver une solution de contournement en regardant un autre problème sur SO: Impossible de trouver un exécutable pour CFBundle CertUIFramework. Axbundle

Il suffit de faire:

cliquez sur iOS Simulator> Réinitialiser le contenu et les paramètres ... et exécutez-le à nouveau.

Le problème ne devrait plus être là

19
Kevin Delord

Dans mon cas, j'ai ces erreurs dans ce code:

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

après quelques réflexions et un test, je détecte le problème - c’est cet appel:

[path fill];

comme je le détecte - dans mon code, cet appel n'est pas nécessaire, car le remplissage se fera par un autre moyen - je le supprime simplement.

16
Denis Kozhukhov

Réponse directe: Le problème est que vous avez utilisé des éléments graphiques principaux tels que CGContext, etc. dans une méthode autre que - (void)drawRect:(CGRect)rect.

Maintenant, veuillez déplacer votre code à cette méthode. Et cela vous évitera des avertissements/erreurs.

5
user3693546

J'ai eu ce même problème et j'ai oublié d'importer QuartzCore/QuartzCore.h, Cela a résolu mon problème avec ces erreurs.

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

J'avais cette erreur parce que j'utilisais un objet UIColor comme attribut dans un dictionnaire NSAttributedString utilisé dans un objet CATextLayer. J'ai changé le dictionnaire pour tenir un CGColorRef et l'erreur est partie.

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

J'ai eu des cas où le contexte retourné par UIGraphicsGetCurrentContext() est NULL, et si vous essayez de l'utiliser pour quoi que ce soit, ce message apparaît. La vue a la responsabilité d'insérer un contexte à l'aide de UIGraphicsPushContext avant d'appeler drawRect:. Si vous appelez directement drawRect: au lieu de [view setNeedsDisplay], vous risquez que le contexte ne soit pas encore défini. Mon intuition est qu'avant iOS 7, le contexte était poussé pour la vue sur init et maintenant sur iOS 7, le contexte n'est pas poussé jusqu'à la première fois que drawRect: est sur le point d'être appelé. Je soupçonne que du code UIKit appelle directement drawRect: et c’est pourquoi il existe des problèmes avec du code même lorsque aucun dessin personnalisé n’est fait.

Solutions (si dessin personnalisé):

  1. N'appelez pas drawRect: directement, utilisez [view setNeedsDisplay] ou si vous avez besoin d'un dessin immédiat, utilisez [view.layer draw]
  2. Dans votre drawRect:, obtenez le contexte mais ne l'utilisez pas en dehors du corps de cette instruction if. if (context) {<do drawing here>}
2
jamone

Dans mon cas, je recevais cet avertissement lors de la création d'une image résistante avec des incrustations. Le problème était que je ne laissais pas au moins 1 pixel dans la zone "non coiffée".

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

J'ai eu cette erreur dans la méthode drawInContext (..) de mon implémentation CALayer personnalisée. UIBezierPath tente d'utiliser le UIGraphicsGetCurrentContext () qui est nul par défaut dans un calque personnalisé. La documentation en ligne explique cela très clairement - 

Si vous n'utilisez pas d'objet UIView pour effectuer votre dessin, vous devez insérer un contexte valide sur la pile manuellement à l'aide de la fonction UIGraphicsPushContext.

Voici le code qui a finalement fonctionné avec mes commentaires en ligne (code Swift, mais la solution reste la même).

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

Dans certains cas, vous devrez peut-être inclure la ligne #import <QuartzCore/QuartzCore.h>.

2
Nagarjun

Si vous désactivez l'autolayout dans la vue concernée, cette erreur disparaît dans certains cas lorsque vous placez et déplacez des éléments d'interface utilisateur (en particulier des éléments personnalisés dessinés par programme) dans une vue. J'utilisais JVFloatLabeledTextField lorsque j'ai découvert ce symptôme.

2
JuJoDi

J'ai eu l'erreur avec le code

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;

et après enlevé le code

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

Le monde est devenu silencieux

1
wossoneri

Je créais UIImage à partir du contexte en utilisant le code ci-dessous:

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

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

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

Ainsi, j'ai eu l'erreur.

J'ai donc supprimé le contenu des données dérivées, redémarré mon XCode. Et ça a fonctionné.

1
Meet

J'ai le même problème . Dans mon projet, j'ai essayé de créer un textField et l'ajouter à mon fichier pdf .

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

Après avoir résolu ce problème, le code a changé:

old:[[UIColor blackColor] setFill]; 

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

J'ai trouvé la solution sur UIColor SetFill ne fonctionne pas ..__ Et merci à l’assistant.

1
Kate

Désinstallez l'application du simulateur et exécutez à nouveau

0
Nagarjun

Pour moi, cette erreur me causait parce que je publiais le CGContextRef comme indiqué ci-dessous:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    // DRAW BACKGROUND CIRCLE
    CGContextSetFillColorWithColor(context, [[UIColor gray] colorWithAlphaComponent:0.6].CGColor);
    CGContextFillEllipseInRect(context, rect);

//    CGContextRelease(context);
}

Supprimer le communiqué a résolu le problème

0
Kyle Redfearn

Comme d'autres personnes qui ont commenté ici, cet avertissement m'apparaissait lorsque je prenais l'une des actions suivantes:

Sur un champ de texte vide: Double-tapez, maintenez enfoncé, tapez longtemps.

Cela semble n'affecter que iOS 7.0.3

J'ai découvert un travail, l'avertissement ne sera pas déclenché si votre presse-papier n'est pas NULL.

J'ai donc fait ce qui suit dans textFieldDidBeginEditing:

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    if (pasteboard.string.length == 0) {

        pasteboard.string = @" ";

    }
}

J'ai testé cela dans le simulateur pour iOS 7.0.3 sur les iphone 4, 5 et 5 et ne reçois plus l'avertissement. J'ai également testé cela dans le simulateur pour iOS 8 sur l'iPhone 6 et 6 plus, mais je ne crois pas qu'iOS 8 soit affecté.

Nous avons vécu deux jours de frustration avant de découvrir ce travail. J'espère vraiment que ma réponse aidera ceux d'entre vous qui ont le même problème.

0
RS-232

Je l'ai eu quand j'ai mal saisi le nom de l'image dans la méthode activityImage de la sous-classe UIActivity

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

Taper la bonne image a résolu le problème pour moi.

0
Saleh Albuga

Si l'erreur survient lorsque vous utilisez UIBezierPath et définissez la couleur pour le contour ou le remplissage, placez le code de couleur défini dans la fonction drawRect plutôt que d'autres emplacements.

0
Chuyang

C'est hacky mais cela a fonctionné pour moi.

J'ai configuré la UIImageView dans la UITableViewCell 's init, lui donnant une taille et des contraintes.

Ensuite, dans la vue cellForRowAtIndexPath de mon contrôleur, je fais ceci:

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

Et cela évite l’erreur, puis au-dessous de cela dans la fonction, je mets l’image réelle pour cette UIImageView. Le code ci-dessus est un bon défaut 

0
Zack Shapiro

Pour moi, la réponse était que je libérais inutilement le contexte graphique dans drawRect:. Jeter un point d'arrêt symbolique sur CGPostError m'a indiqué le coupable. 

0
Taylor Halliday

Vous avez cette erreur comme je l'avais réglé 

textfield.delegate = self

Sans mettre en œuvre aucune des routines de délégué. Supprimer cette ligne a résolu le problème pour moi

0
Daniel Åkesson

J'ai eu ce problème dans un UITextField lorsque j'ai appuyé sur un champ vide avec juste un texte de substitution J'ai utilisé la solution suivante pour éliminer les champs vides:

-(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
}
0
Peter B. Kramer