invalid context 0x0 under iOS 7.0 and system degradation

Objective CIos7Core Graphics

Objective C Problem Overview


I've read as many search results I could find on this dreaded problem, unfortunatelly, each one seems to focus on a specific function call.

My problem is that I get the same error from multiple functions, which I am guessing are being called back from functions that I use.

To make matters worse, the actual code is within a custom private framework which is being imported in another project, and as such, debugging isn't as simple?

Can anyone point me to the right direction? I have a feeling I'm calling certain methods wrongly or with bad context, but the output from xcode is not very helpful at this point.

> : CGContextSetFillColorWithColor: invalid context 0x0. This is > a serious error. This application, or a library it uses, is using an > invalid context and is thereby contributing to an overall degradation > of system stability and reliability. This notice is a courtesy: please > fix this problem. It will become a fatal error in an upcoming update. > > : CGContextSetStrokeColorWithColor: invalid context 0x0. This > is a serious error. This application, or a library it uses, is using > an invalid context and is thereby contributing to an overall > degradation of system stability and reliability. This notice is a > courtesy: please fix this problem. It will become a fatal error in an > upcoming update. > > CGContextSaveGState: invalid context 0x0. This is a serious error. > This application, or a library it uses, is using an invalid context > and is thereby contributing to an overall degradation of system > stability and reliability. This notice is a courtesy: please fix this > problem. It will become a fatal error in an upcoming update. > > : CGContextSetFlatness: invalid context 0x0. This is a serious > error. This application, or a library it uses, is using an invalid > context and is thereby contributing to an overall degradation of > system stability and reliability. This notice is a courtesy: please > fix this problem. It will become a fatal error in an upcoming update. > > > : CGContextAddPath: invalid context 0x0. This is a serious > error. This application, or a library it uses, is using an invalid > context and is thereby contributing to an overall degradation of > system stability and reliability. This notice is a courtesy: please > fix this problem. It will become a fatal error in an upcoming update. > > : CGContextDrawPath: invalid context 0x0. This is a serious > error. This application, or a library it uses, is using an invalid > context and is thereby contributing to an overall degradation of > system stability and reliability. This notice is a courtesy: please > fix this problem. It will become a fatal error in an upcoming update. > > > : CGContextRestoreGState: invalid context 0x0. This is a > serious error. This application, or a library it uses, is using an > invalid context and is thereby contributing to an overall degradation > of system stability and reliability. This notice is a courtesy: please > fix this problem. It will become a fatal error in an upcoming update. > > > : CGContextGetBlendMode: invalid context 0x0. This is a serious > error. This application, or a library it uses, is using an invalid > context and is thereby contributing to an overall degradation of > system stability and reliability. This notice is a courtesy: please > fix this problem. It will become a fatal error in an upcoming update.

Those errors may occur when a custom view is presented, or one of its inherited classes. At which point they spawn multiple times, until the keyboard won't provide any input. Touch events are still registered, but system slows down, and eventually may lead to unallocated object errors.

EDIT #1: I do have access to the framework being imported, but I do not see anything weird in the classes which causing the issue.

EDIT #2: I just received an email that iOS 7.1 has been released for developers. I'm curious to see if this goes away, or become worse, or can be solved.

Objective C Solutions


Solution 1 - Objective C

If you're curious what code is causing these logs, you can add a symbolic breakpoint on CGPostError.

Solution 2 - Objective C

Others will ask you to post the code where you access a core graphics context, but I doubt that's the issue. These invalid context 0x0 error messages are common and easy to reproduce in iOS 7. In fact, I can reproduce the error using storyboard with zero code. I drag a UITextField onto the canvas in IB, run the app, and double tap inside the text field.

In many situations, it's hard for me to take the invalid context 0x0 error messages seriously. I don't know if your situation warrants greater concern (I agree with Rob Napier that it's worth investigating, especially if you are explicitly using a graphics context).

In my own projects, I'm hoping that many of these errors magically disappear some day (but that day did not come with 7.0.3).

Update: After installing Xcode 5.1 and targeting iOS 7.1, I can no longer reproduce the error by double tapping inside an empty text field.

Solution 3 - Objective C

These sorts of errors are historically the result of calling Core Graphics functions when not within a context that is established within drawRect or between calls like UIGraphicsBeginImageContext and UIGraphicsEndImageContext (or other UIKit functions like that which begin and end a context).

Having said that, though, bilobatum is correct that this particular sequence of errors can be a result of that iOS 7 bug he references in his answer. If not seeing these errors in your iOS6 targets, or if after a quick scan of this private framework you don't find any suspect Core Graphics calls, it may just be this iOS 7 bug. Good catch, bilobatum!

Solution 4 - Objective C

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

make sure the size.width or size.height is not 0,

you can add symbol breakpoint to CGPostError to check

Solution 5 - Objective C

I had this problem with a simple UITextField (keyboard not showing up and many different invalid context error messages on the console). I just find a workaround by looking to another problem on SO: https://stackoverflow.com/questions/18888059/cannot-find-executable-for-cfbundle-certuiframework-axbundle

Just do:

> click on iOS Simulator > Reset Content and Settings... and run again.

The problem shouldn't be there anymore

Solution 6 - Objective C

In my case i've got these errors in this 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];

after some thoughts and test I detect the problem - it was this call:

[path fill];

as I detect - in my code this call is not necessary, because of filling will be done by other way - so I simply remove it.

Solution 7 - Objective C

I had this same issue and I forgot to import QuartzCore/QuartzCore.h, This solved my issue with these errors.

    #import <QuartzCore/QuartzCore.h>

Solution 8 - Objective C

Straight Answer : The problem is because you have used Core graphics elements like CGContext etc in other than - (void)drawRect:(CGRect)rect this method.

Now kindly move your code to this method. And it will strop giving you warnings/Errors.

Solution 9 - Objective C

I was getting this error because I was using a UIColor object as an attribute in an NSAttributedString dictionary that was being used in a CATextLayer object. I changed the dictionary to hold a CGColorRef and the error went away.

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

Solution 10 - Objective C

I have had cases where the context returned from UIGraphicsGetCurrentContext() is NULL, and if you try using it for anything this message appears. It is the view's responsibility to push a context using UIGraphicsPushContext prior to calling drawRect:, if you call drawRect: directly instead of [view setNeedsDisplay] you risk the context not being set yet. My hunch is that prior to iOS 7 the context was pushed for the view on init, and now on iOS 7 the context isn't pushed until the first time drawRect: is about to be called. I suspect some UIKit code is calling drawRect: directly and this is why there are issues with some code even when no custom drawing is being done.

Solutions (if doing custom drawing):

  1. Don't call drawRect: directly, use [view setNeedsDisplay] or if you need immediate drawing use [view.layer draw]
  2. In your drawRect: get the context but don't use it outside the body of this if statement if (context) {<do drawing here>}

Solution 11 - Objective C

Turning off autolayout in the affected view causes this error to go away in some cases where you're placing and moving UI elements (especially custom ones which are drawn programmatically) within a view. I was using JVFloatLabeledTextField when I discovered this symptom.

Solution 12 - Objective C

In some cases you may need to include the line #import <QuartzCore/QuartzCore.h>.

Solution 13 - Objective C

I got this error in the drawInContext(..) method of my custom CALayer implementation. UIBezierPath tries to use the UIGraphicsGetCurrentContext() which is nil by default in a custom layer. The online documentation explains this very clearly -

> If you are not using a UIView object to do your drawing, however, you must push a valid context onto the stack manually using the UIGraphicsPushContext function.

Here's the code that finally worked with my comments inline (Swift code, but the solution is the same regardless)

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

Solution 14 - Objective C

In my case I was having this warning when creating a resible image with cap insets. The problem was that I wasn't leaving at least 1 pixel in the "uncapped" area.

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

Solution 15 - Objective C

I was creating UIImage from context using below code:

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

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

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

Thus I was getting the error.

So I removed the Derived Data content, restarted my XCode. And it worked.

Solution 16 - Objective C

I have the same problem. In my project, i have try to create a textField and add it to my pdf file. Old 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]}];
}

After solved this problem,the code changed :

old:[[UIColor blackColor] setFill]; 

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

I found the solution at https://stackoverflow.com/questions/10623545/uicolor-setfill-doesnt-work. And Thanks the helper.

Solution 17 - Objective C

I got the error with the 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;

and after removed the code

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

The world became silent

Solution 18 - Objective C

I had this problem in a UITextField when I held the touch over a blank field with just placeholder text. I used the following work-around to eliminate blank fields:

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

Solution 19 - Objective C

For me, the answer was that I was unnecessarily releasing the graphics context in drawRect:. Throwing a symbolic breakpoint on CGPostError pointed me to the culprit.

Solution 20 - Objective C

Got this error as I had set

textfield.delegate = self

Without implementing any of the delegate routines. Removing that line solved the problem for me

Solution 21 - Objective C

For me I was getting this error because I was releasing the the CGContextRef as shown below:

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

Removing the release solved the issue

Solution 22 - Objective C

I got it when I mistyped the image name in activityImage method in UIActivity subclass

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

Typing the right image solved it for me.

Solution 23 - Objective C

Uninstall the app from simulator and run again

Solution 24 - Objective C

Like others whom have commented here I was getting this warning when I did any of the following:

On a blank text field: Double tapping, touch and hold, long single tap.

This seems to only affect iOS 7.0.3

I discovered a work around, the warning will not be triggered if your pasteboard is not NULL.

So I did the following in textFieldDidBeginEditing:

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

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

    }
}

I tested this out in simulator for iOS 7.0.3 on the iphone 4s, 5 and 5s and no longer receive the warning. I also tested this out in simulator for iOS 8 on the iphone 6 and 6 plus but I don't believe iOS 8 is affected.

Went through two days of frustration before discovering this work around so I really hope my answer helps those of you who are having the same issue.

Solution 25 - Objective C

If the error occurs when you are using UIBezierPath and set color for stroke or fill, put the set color code in drawRect function rather than other places.

Solution 26 - Objective C

This is hacky but it worked for me.

I set up the UIImageView in the UITableViewCell's init, give it a size and constraints.

Then in my view controller's cellForRowAtIndexPath I do this:

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

And that avoids the error, then below that in the function I set the actual image for that UIImageView. The code above is a good default

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Question&#198;lexView Question on Stackoverflow
Solution 1 - Objective CArt GillespieView Answer on Stackoverflow
Solution 2 - Objective CbilobatumView Answer on Stackoverflow
Solution 3 - Objective CRobView Answer on Stackoverflow
Solution 4 - Objective ClbsweekView Answer on Stackoverflow
Solution 5 - Objective CKevin DelordView Answer on Stackoverflow
Solution 6 - Objective CDenis KozhukhovView Answer on Stackoverflow
Solution 7 - Objective CDavid RoopView Answer on Stackoverflow
Solution 8 - Objective Cuser3693546View Answer on Stackoverflow
Solution 9 - Objective CCollinView Answer on Stackoverflow
Solution 10 - Objective CjamoneView Answer on Stackoverflow
Solution 11 - Objective CJuJoDiView Answer on Stackoverflow
Solution 12 - Objective CNagarjunView Answer on Stackoverflow
Solution 13 - Objective CinderView Answer on Stackoverflow
Solution 14 - Objective CbalkothView Answer on Stackoverflow
Solution 15 - Objective CMeetView Answer on Stackoverflow
Solution 16 - Objective CKateView Answer on Stackoverflow
Solution 17 - Objective CwossoneriView Answer on Stackoverflow
Solution 18 - Objective CPeter B. KramerView Answer on Stackoverflow
Solution 19 - Objective CTaylor HallidayView Answer on Stackoverflow
Solution 20 - Objective CDaniel ÅkessonView Answer on Stackoverflow
Solution 21 - Objective CKyle RedfearnView Answer on Stackoverflow
Solution 22 - Objective CSaleh AlbugaView Answer on Stackoverflow
Solution 23 - Objective CNagarjunView Answer on Stackoverflow
Solution 24 - Objective CRS-232View Answer on Stackoverflow
Solution 25 - Objective CChuyangView Answer on Stackoverflow
Solution 26 - Objective CZack ShapiroView Answer on Stackoverflow