Недопустимый контекст 0x0 под iOS 7.0 и деградация системы

Я читал столько результатов поиска, которые я мог найти по этой страшной проблеме, к сожалению, каждый из них, похоже, сосредоточен на конкретном вызове функции.

Моя проблема в том, что я получаю ту же ошибку от нескольких функций, которые, как я предполагаю, вызывается из функций, которые я использую.

Что еще хуже, фактический код находится в пользовательской частной структуре, которая импортируется в другой проект, и, таким образом, отладка не так проста?

Может ли кто-нибудь указать мне правильное направление? У меня есть чувство, что я вызываю определенные методы неправильно или с плохим контекстом, но вывод из xcode не очень полезен на данный момент.

: CGContextSetFillColorWithColor: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека использует недействительный контекст и тем самым способствует общей деградации стабильности и надежности системы. Это уведомление является любезностью: пожалуйста исправить эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении.

: CGContextSetStrokeColorWithColor: недопустимый контекст 0x0. Эта является серьезной ошибкой. Это приложение или используемая им библиотека использует недействительный контекст и тем самым способствует общему ухудшение стабильности и надежности системы. Это уведомление является любезность: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в предстоящее обновление.

CGContextSaveGState: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека использует недопустимый контекст и тем самым способствует общей деградации системы стабильности и надежности. Это уведомление является любезностью: пожалуйста, исправьте это проблема. Это станет фатальной ошибкой в ​​предстоящем обновлении.

: CGContextSetFlatness: недопустимый контекст 0x0. Это серьезное ошибка. Это приложение или используемая им библиотека использует недопустимый контекста и тем самым способствует общей деградации стабильности и надежности системы. Это уведомление является любезностью: пожалуйста исправить эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении.

: CGContextAddPath: недопустимый контекст 0x0. Это серьезное ошибка. Это приложение или используемая им библиотека использует недопустимый контекста и тем самым способствует общей деградации стабильности и надежности системы. Это уведомление является любезностью: пожалуйста исправить эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении.

: CGContextDrawPath: недопустимый контекст 0x0. Это серьезное ошибка. Это приложение или используемая им библиотека использует недопустимый контекста и тем самым способствует общей деградации стабильности и надежности системы. Это уведомление является любезностью: пожалуйста исправить эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении.

: CGContextRestoreGState: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека использует недействительный контекст и тем самым способствует общей деградации стабильности и надежности системы. Это уведомление является любезностью: пожалуйста исправить эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении.

: CGContextGetBlendMode: недопустимый контекст 0x0. Это серьезное ошибка. Это приложение или используемая им библиотека использует недопустимый контекста и тем самым способствует общей деградации стабильности и надежности системы. Это уведомление является любезностью: пожалуйста исправить эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении.

Эти ошибки могут возникать при представлении пользовательского представления или в одном из его унаследованных классов. В этот момент они появляются несколько раз, пока клавиатура не будет вводить какие-либо данные. События касания все еще зарегистрированы, но система замедляется и в конечном итоге может привести к ошибкам нераспределенного объекта.

EDIT # 1: У меня есть доступ к импортируемой структуре, но я не вижу ничего странного в классах, которые вызывают проблему.

EDIT # 2: Я только что получил электронное письмо, которое iOS 7.1 было выпущено для разработчиков. Мне любопытно посмотреть, не исчезнет ли это, или ухудшится, или может быть решена.

Ответ 1

Другие попросят вас опубликовать код, где вы обращаетесь к основному графическому контексту, но я сомневаюсь, что проблема. Эти недопустимые сообщения об ошибках 0x0 контекста являются общими и легко воспроизводятся в iOS 7. Фактически, я могу воспроизвести ошибку, используя раскадровку с нулевым кодом. Я перетащил UITextField на холст в IB, запустил приложение и дважды коснулся текстового поля.

Во многих ситуациях мне тяжело воспринимать неверные сообщения об ошибках 0x0. Я не знаю, требует ли ваша ситуация большую озабоченность (я согласен с Робом Нейпиром, что он стоит исследовать, особенно если вы явно используете графический контекст).

В моих собственных проектах я надеюсь, что многие из этих ошибок волшебным образом исчезнут однажды (но в этот день не было 7.0.3).

Обновление: После установки Xcode 5.1 и ориентации на iOS 7.1 я больше не могу воспроизвести ошибку, дважды нажав в пустое текстовое поле.

Ответ 3

Эти виды ошибок исторически являются результатом вызова функций Core Graphics, если они не находятся в контексте, установленном в drawRect, или между вызовами типа UIGraphicsBeginImageContext и UIGraphicsEndImageContext (или другие функции UIKit, такие как начало и конец контекста).

Сказав, что, однако, билобатум прав, что эта конкретная последовательность ошибок может быть результатом ошибки iOS 7, которую он ссылается в своем ответе. Если вы не видите эти ошибки в своих целях iOS6, или если после быстрого сканирования этой частной структуры вы не найдете подозрительных вызовов Core Graphics, это может быть просто ошибка iOS 7. Хороший улов, билобатум!

Ответ 4

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

убедитесь, что size.width или size.height не 0,

вы можете добавить точку останова символа в CGPostError, чтобы проверить

Ответ 5

У меня была эта проблема с простым UITextField (клавиатура не отображалась и на сервере не отображалось много недопустимых сообщений об ошибках контекста). Я просто нашел обходное решение, посмотрев на другую проблему на SO: Невозможно найти исполняемый файл для CFBundle CertUIFramework.axbundle

Просто выполните:

нажмите на iOS Simulator > Reset Содержимое и настройки... и запустите снова.

Проблема не должна быть там больше

Ответ 6

В моем случае у меня есть эти ошибки в этом коде:

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

после некоторых мыслей и теста я обнаружил проблему - это был этот вызов:

[path fill];

как я обнаружил - в моем коде этот вызов не нужен, потому что заполнение будет выполнено другим способом - так что я просто удалю его.

Ответ 7

У меня была эта же проблема, и я забыл импортировать QuartzCore/QuartzCore.h. Это решило мою проблему с этими ошибками.

    #import <QuartzCore/QuartzCore.h>

Ответ 8

Я получал эту ошибку, потому что я использовал объект UIColor как атрибут в словаре NSAttributedString, который использовался в объекте CATextLayer. Я изменил словарь, чтобы провести CGColorRef, и ошибка исчезла.

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

Ответ 9

Прямой ответ: Проблема заключается в том, что вы использовали ключевые графические элементы Core, такие как CGContext и т.д., В отличие от - (void)drawRect:(CGRect)rect этого метода.

Теперь любезно переместите свой код на этот метод. И он будет строгать, давая вам предупреждения/ошибки.

Ответ 10

У меня были случаи, когда контекст, возвращаемый из UIGraphicsGetCurrentContext(), равен NULL, и если вы попытаетесь использовать его для чего-либо, это сообщение появится. Возникает вопрос о толковании контекста с использованием UIGraphicsPushContext перед вызовом drawRect:, если вы вызываете drawRect: напрямую, а не [view setNeedsDisplay], вы рискуете, что контекст еще не установлен. Моя догадка заключается в том, что до iOS 7 контекст был нажат для представления на init, а теперь на iOS 7 контекст не нажимается до первого вызова drawRect:. Я подозреваю, что какой-то код UIKit вызывает drawRect: напрямую, и поэтому возникают проблемы с некоторым кодом, даже когда пользовательский чертеж не выполняется.

Решения (при выполнении пользовательского чертежа):

  • Не вызывайте drawRect: напрямую, используйте [view setNeedsDisplay] или если вам требуется немедленное использование рисунка [view.layer draw]
  • В вашем drawRect: получить контекст, но не использовать его вне тела этого оператора if if (context) {<do drawing here>}

Ответ 11

Отключение автозапуска в затронутом представлении приводит к тому, что эта ошибка исчезает в некоторых случаях, когда вы размещаете и перемещаете элементы пользовательского интерфейса (особенно пользовательские, которые рисуются программно) в виде. Я использовал JVFloatLabeledTextField, когда обнаружил этот симптом.

Ответ 12

В некоторых случаях вам может потребоваться включить строку #import <QuartzCore/QuartzCore.h>.

Ответ 13

Я получил эту ошибку в методе drawInContext (..) моей пользовательской реализации CALayer. UIBezierPath пытается использовать UIGraphicsGetCurrentContext(), который по умолчанию равен нулю в пользовательском слое. онлайн-документация объясняет это очень четко -

Если вы не используете объект UIView для выполнения вашего чертежа, вы должны вручную ввести действительный контекст в стек, используя функцию UIGraphicsPushContext.

Вот код, который, наконец, работал с моими комментариями inline (код Swift, но решение одинаково независимо)

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

Ответ 14

В моем случае у меня было это предупреждение, когда вы создавали изображение с надписью с надписью с надписью. Проблема заключалась в том, что я не оставлял по крайней мере 1 пиксель в области "uncapped".

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

Ответ 15

Я создавал UIImage из контекста, используя нижеприведенный код:

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

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

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

Таким образом, я получал ошибку.

Итак, я удалил содержимое Derived Data, перезапустил свой XCode. И это сработало.

Ответ 16

У меня та же проблема. В моем проекте я попытался создать textField и добавить его в файл 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]}];
}

После решения этой проблемы код изменился:

old:[[UIColor blackColor] setFill]; 

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

Я нашел решение в UIColor SetFill не работает. И спасибо помощнику.

Ответ 17

Я получил ошибку с кодом

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;

и после удаления кода

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

Мир замолчал

Ответ 18

У меня была эта проблема в UITextField, когда я коснулся пустого поля с помощью только текста заполнителя. Для устранения пустых полей я использовал следующую работу:

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

Ответ 19

Для меня ответ заключался в том, что я излишне освобождал графический контекст в drawRect:. Бросив символическую точку останова на CGPostError, я указал на виновника.

Ответ 20

Получил эту ошибку, поскольку я установил

textfield.delegate = self

Без реализации какой-либо из подпрограмм делегата. Удаление этой линии решило проблему для меня

Ответ 21

Для меня я получал эту ошибку, потому что я выпускал CGContextRef, как показано ниже:

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

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

//    CGContextRelease(context);
}

Удаление релиза решило проблему

Ответ 22

Я получил его, когда я ошибся в имени изображения в методе activityImage в подклассе UIActivity

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

Ввод правильного изображения разрешил его для меня.

Ответ 23

Удалите приложение из симулятора и снова запустите

Ответ 24

Как и другие, которые комментировали здесь, я получал это предупреждение, когда выполнял одно из следующих действий:

В пустое текстовое поле: двойное нажатие, касание и удержание, длительное нажатие.

Это, по-видимому, влияет только на iOS 7.0.3

Я обнаружил работу, предупреждение не будет запущено, если ваш картон не равен NULL.

Итак, я сделал следующее в textFieldDidBeginEditing:

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

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

        pasteboard.string = @" ";

    }
}

Я тестировал это в симуляторе для iOS 7.0.3 на iphone 4s, 5 и 5s и больше не получил предупреждение. Я также тестировал это в симуляторе для iOS 8 на iphone 6 и 6 плюс, но я не считаю, что на iOS 8 влияет.

Прошел через два дня разочарования, прежде чем открывать эту работу, поэтому я очень надеюсь, что мой ответ поможет тем из вас, у кого есть такая же проблема.

Ответ 25

Если ошибка возникает, когда вы используете UIBezierPath и устанавливаете цвет для штриха или заливки, поместите заданный цветовой код в функцию drawRect, а не в другие места.