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

218

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

Mon problème est que j'obtiens la même erreur de plusieurs fonctions, qui, je suppose, sont rappelées à partir des fonctions que j'utilise.

Pour aggraver les choses, le code réel se trouve dans un cadre privé personnalisé qui est importé dans un autre projet, et en tant que tel, le débogage n'est pas aussi simple?

Quelqu'un peut-il m'orienter dans 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 non valide 0x0. C'est une erreur sérieuse. Cette application, ou une bibliothèque qu'elle utilise, utilise un contexte non valide et contribue ainsi à une dégradation globale de la stabilité et de la fiabilité du système. Cet avis est une courtoisie: veuillez résoudre ce problème. Cela deviendra une erreur fatale dans une prochaine mise à jour.

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

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

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

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

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

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

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

Ces erreurs peuvent se produire lorsqu'une vue personnalisée est présentée ou l'une de ses classes héritées. À ce 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 en cours d'importation, mais je ne vois rien de bizarre dans les classes à l'origine du problème.

EDIT # 2: Je viens de recevoir un e-mail annonçant la sortie d'iOS 7.1 pour les développeurs. Je suis curieux de voir si cela disparaît, s'aggrave ou peut être résolu.

Ælex
la source
8
Nous obtenons cette même erreur dans notre application - à partir de la zone de texte standard du formulaire. Si vous appuyez plusieurs fois sur la zone de texte pendant que le clavier s'affiche, cette erreur apparaîtra.
Pareil ici. Parfois des centaines de ces journaux, parfois zéro. Je pensais que c'était parce que j'écrasais drawRect: mais il semble que ce soit autre chose. L'ignorer pour l'instant.
Krumelur
2
Je viens de terminer le premier tutoriel sur developer.apple.com (copie du code suggéré par Apple) et j'obtiens cette même erreur. Peut-être que si des programmeurs plus expérimentés regardent ce didacticiel, ils sont en mesure de rechercher la cause de ce problème.
Antonio Sesto
1
Voir ci-dessous (désactiver la mise en page automatique dans les vues où vous utilisez les éléments d'interface utilisateur personnalisés)
JuJoDi
1
Cela se produit toujours en 2016 (XCode 7, iOS 9.2), toujours aucun mal apparent.
Hatchmaster J

Réponses:

162

D'autres vous demanderont de poster le code où vous accédez à un contexte graphique de base, mais je doute que ce soit le problème. Ces messages d'erreur de contexte non valide 0x0 sont courants et faciles à reproduire dans iOS 7. En fait, je peux reproduire l'erreur en utilisant un storyboard avec zéro code. Je fais glisser un UITextField sur le canevas dans IB, exécute l'application et appuie deux fois à l'intérieur du champ de texte.

Dans de nombreuses situations, il est difficile pour moi de prendre au sérieux les messages d'erreur de contexte non valide 0x0. Je ne sais pas si votre situation mérite une plus grande inquiétude (je suis d'accord avec Rob Napier que cela vaut la peine d'être étudié, surtout si vous utilisez explicitement un contexte graphique).

Dans mes propres projets, j'espère que beaucoup de ces erreurs disparaissent comme par magie un jour (mais ce jour n'est pas venu avec 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 à l'intérieur d'un champ de texte vide.

bilobatum
la source
10
Vous avez tout à fait raison à propos de ce bogue iOS 7 UITextField. Soyez sûr d'ouvrir un radar pour cela, cependant (bugreport.apple.com) Mais ne soyez pas trop rapide pour supposer que c'est le problème ici. Puisqu'il s'agit d'une vue personnalisée, il vaut la peine d'abord d'examiner les points de @ Rob.
Rob Napier
2
Cela m'arrive .. Je laisse tomber un uitextfield sur IB, j'obtiens cette erreur et le clavier n'apparaît pas ... y a-t-il une solution ?? Merci
Frade
@Frade Pour moi, le clavier apparaît et l'application fonctionne normalement malgré le message d'erreur sévère. Vous pouvez donc avoir un problème supplémentaire.
bilobatum
3
J'ai également le même problème. Cela ne se produit également que dans le simulateur, mais j'ai remarqué que, lorsque je reçois le bug, je ne peux pas utiliser le clavier Mac pour taper dans le simulateur et je dois utiliser le clavier à l'écran, ce qui est très frustrant. Dans mon application, je n'utilise aucune vue personnalisée, donc je ne crée ni n'utilise jamais manuellement un contexte CG.
1
Dieu merci, je pensais que c'était mon application qui était en faute! Vous avez tout à fait raison cependant; c'était un double-clic dans un champ de texte qui me causait également cette erreur.
Ash
201

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

Art Gillespie
la source
2
Merci pour l'astuce sur CGPostError. J'ai mis un point d'arrêt dessus et il semble que je ne fasse rien pour causer ce problème. Dans mon cas, cela se produit sur le thread principal mais pas dans mon code.
Paul Heller
10
Votez ceci parce que, bien que ce ne soit pas la solution dans ce cas spécifique, il mettra souvent en évidence où se situe le défaut, quand il est dans la portée du propre code du programmeur.
Ash
27
C'est une excellente suggestion. Pour ceux qui ne sont pas familiers avec les points d'arrêt symboliques ou comment les ajouter dans Xcode, voici le document d'Apple à ce sujet. developer.apple.com/library/ios/recipes/…
Tony Adams
Cela m'a aidé. Dans mon cas, cela a mis en évidence mon ajout d'un NSGradient à une vue sur mon application OS X.
Aaron Vegh
1
Il semble que je dessinais avant de mettre un cadre pour une certaine vue, merci! :)
Rick van der Linde
42

Ces sortes d'erreurs sont historiquement le résultat de l'appel de fonctions Core Graphics lorsqu'elles ne sont pas dans un contexte qui est établi dans drawRectou entre des appels comme UIGraphicsBeginImageContextet UIGraphicsEndImageContext(ou d'autres fonctions UIKit comme celle qui commence et termine un contexte).

Cela dit, cependant, bilobatum a raison de dire que cette séquence d'erreurs particulière peut être le résultat du bogue iOS 7 auquel il fait référence 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 peut s'agir simplement de ce bogue iOS 7. Bonne prise, bilobatum!

Rob
la source
J'ai une vue dans le cadre privé qui appelle drawRect. Bien que je n'appelle directement aucune des méthodes mentionnées, ma seule hypothèse est que le code de cette classe est en quelque sorte lié. Pourtant, comme je l'ai mentionné, tout fonctionne bien sous les iOS précédents.
Ælex
Dans un souci de finalisation (c'est le meilleur résultat google), je voudrais noter que l'erreur cryptique est inchangée sur OSX 10.11.3 - et causée, comme le dit Rob, en ayant une fonction de dessin en dehors de drawRect ou d'un autre contexte - fonction connexe.
green_knight
26
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

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

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

lbsweek
la source
donc… en ajoutant un point d'arrêt symbolique à CGPostError, comment peut-on regarder la taille à ce point?
Cris
vous pouvez afficher la pile d'appels de fonction dans "afficher la navigation de débogage" par la commande + 6. puis vous cliquez sur l'arborescence, puis vous pouvez revenir à votre fonction pour visualiser la variable.
semaine du
Oui, je passais imageview pour rendre cette imagview circulaire, mais j'ai trouvé que sa taille était nulle. Enfin résolu après 2 jours: D.
JiteshW
19

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

Faites juste:

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

Le problème ne devrait plus être là

Kevin Delord
la source
16

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 tests je détecte le problème - c'était 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 - donc je le supprime simplement.

Denis Kozhukhov
la source
5

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>
David Roop
la source
5

Réponse directe: le problème est que vous avez utilisé des éléments graphiques Core comme CGContext, etc. dans d'autres- (void)drawRect:(CGRect)rect méthode cette méthode.

Maintenant, veuillez déplacer votre code vers cette méthode. Et il se détendra vous donnant des avertissements / erreurs.


la source
4

J'obtenais cette erreur car j'utilisais un objet UIColor comme attribut dans un dictionnaire NSAttributedString qui était utilisé dans un objet CATextLayer. J'ai changé le dictionnaire pour contenir un CGColorRef et l'erreur a disparu.

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

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

Solutions (si vous faites un dessin personnalisé):

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

La désactivation de la mise en page automatique dans la vue affectée entraîne la disparition de cette erreur dans certains cas où vous placez et déplacez des éléments d'interface utilisateur (en particulier ceux personnalisés qui sont dessinés par programme) dans une vue. J'utilisais JVFloatLabeledTextField lorsque j'ai découvert ce symptôme.

JuJoDi
la source
2

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

Nagarjun
la source
2

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

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

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

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
la source
2

Dans mon cas, je recevais cet avertissement lors de la création d'une image resible avec des inserts de capuchon. Le problème était que je ne laissais pas au moins 1 pixel dans la zone "non plafonné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];
balkoth
la source
1
Eu exactement le même problème. Apparemment, vous devez laisser au moins 1 point de la zone où l'image peut s'étirer
ribeto
1

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

    UIGraphicsBeginImageContext (taille);
    Contexte CGContextRef = UIGraphicsGetCurrentContext ();

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

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

Ainsi j'obtenais l'erreur.

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

Rencontrer
la source
Quelle est la solution alors?
Geek
1
@Geek, solution mise à jour. Supprimez le contenu DerivedData et redémarrez.
Rencontrez le
1

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

- (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é que la solution à UIColor SetFill ne fonctionne pas . Et merci à l'aide.

Kate
la source
1

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 avoir supprimé le code

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

Le monde est devenu silencieux

wossoneri
la source
0

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

Taylor Halliday
la source
0

J'ai cette erreur comme je l'avais définie

textfield.delegate = self

Sans implémenter aucune des routines de délégué. La suppression de cette ligne a résolu le problème pour moi

Daniel Åkesson
la source
0

J'ai eu ce problème dans un UITextField lorsque j'ai maintenu le contact sur un champ vide avec juste du texte d'espace réservé. J'ai utilisé la solution de contournement 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
}
Peter B. Kramer
la source
0

Pour moi, j'obtenais cette erreur car je libérais 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);
}

La suppression de la version a résolu le problème

Kyle Redfearn
la source
0

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

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

Taper la bonne image l'a résolu pour moi.

Saleh Albuga
la source
0

Désinstaller l'application du simulateur et réexécuter

Nagarjun
la source
0

Comme d'autres qui ont commenté ici, j'ai reçu cet avertissement lorsque j'ai fait l'une des choses suivantes:

Sur un champ de texte vide: appuyez deux fois, appuyez longuement sur, appuyez longuement sur une seule touche.

Cela semble n'affecter que iOS 7.0.3

J'ai découvert une solution de contournement, l'avertissement ne sera pas déclenché si votre presse-papiers 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 4s, 5 et 5s et je 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 pense pas que iOS 8 soit affecté.

J'ai traversé deux jours de frustration avant de découvrir ce travail, alors j'espère vraiment que ma réponse aidera ceux d'entre vous qui ont le même problème.

RS-232
la source
0

Si l'erreur se produit 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 qu'à d'autres endroits.

Chuyang
la source
0

C'est hacky mais ça a marché pour moi.

J'ai mis en place le UIImageViewdans le UITableViewCells init, lui donner une taille et des contraintes.

Ensuite, dans mon contrôleur de vue, cellForRowAtIndexPathje 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 en dessous de cela dans la fonction j'ai défini l'image réelle pour cela UIImageView. Le code ci-dessus est un bon défaut

Zack Shapiro
la source