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


218

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

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

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

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

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ # 1: У меня есть доступ к импортируемой структуре, но я не вижу ничего странного в классах, которые вызывают проблему.

РЕДАКТИРОВАТЬ # 2: Я только что получил письмо, что iOS 7.1 был выпущен для разработчиков. Мне любопытно посмотреть, пройдет ли это, или станет хуже, или может быть решена.


8
Эта же ошибка появляется в нашем приложении - из стандартного текстового поля формы. Если вы нажмете на текстовое поле несколько раз, когда клавиатура будет отображаться, появится сообщение об ошибке.

Тоже самое. Иногда сотни таких журналов, иногда ноль. Я думал, что это потому, что я переопределяю drawRect: но, похоже, что-то еще. Игнорируя это сейчас.
Krumelur

2
Я только что закончил первый урок на developer.apple.com (копирование кода, предложенного Apple) и получаю ту же ошибку. Может быть, если более опытные программисты посмотрят на этот учебник, они смогут найти причину этой проблемы.
Антонио Сесто

1
Смотрите ниже (отключите автоматическое расположение в представлениях, где вы используете элементы пользовательского интерфейса)
JuJoDi

1
По-прежнему случается в 2016 году (XCode 7, iOS 9.2), но никакого видимого вреда не произошло.
Хэтчмейстер J

Ответы:


162

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

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

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

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


10
Вы совершенно правы в отношении этой ошибки iOS 7 UITextField. Обязательно откройте для этого радар (bugreport.apple.com), но не спешите предполагать, что проблема здесь. Так как это пользовательский вид, стоит сначала изучить точки @ Роба.
Роб Нейпир

2
Это происходит со мной .. Я опускаю поле uitext на IB, получаю эту ошибку, и клавиатура не появляется .. есть какое-то решение ?? Спасибо
Frade

@Frade Для меня клавиатура появляется и приложение работает нормально, несмотря на строгое сообщение об ошибке. Так что у вас может быть дополнительная проблема.
билобатум

3
У меня тоже есть такая же проблема. Это также происходит только в симуляторе, но я заметил, что, когда я получаю ошибку, я не могу использовать клавиатуру Mac для ввода в симуляторе, и мне приходится использовать экранную клавиатуру, что очень расстраивает. В моем приложении я не использую никаких пользовательских представлений, поэтому я никогда не создаю и не использую контекст CG вручную.

1
Слава Богу, я думал, что виновато мое приложение! Вы совершенно правы, хотя; это был двойной щелчок в текстовом поле, который вызывал эту ошибку и у меня.
Эш

201

Если вам интересно , какой код вызывает эти журналы, вы можете добавить символическую точку останова на CGPostError.


2
Спасибо за совет о CGPostError. Я поставил точку останова, и похоже, что я ничего не делаю, чтобы вызвать эту проблему. В моем случае это происходит в основном потоке, но не в моем коде.
Пол Хеллер

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

27
Это отличное предложение. Для тех, кто не знаком с символическими точками останова или как их добавить в XCode, вот документ Apple об этом. developer.apple.com/library/ios/recipes/...
Тони Адамс

Это помогло мне. В моем случае это выдвинуло на первый план добавление NSGradient к представлению в моем приложении OS X.
Аарон Вег

1
Кажется, я рисовал перед установкой рамки для определенного вида, спасибо! :)
Рик ван дер Линде

42

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

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


У меня есть представление в частной структуре, которая вызывает drawRect. Принимая во внимание, что я не вызываю напрямую ни один из упомянутых методов, мое единственное предположение - то, что код в этом классе так или иначе связан. Тем не менее, как я уже говорил, все работает гладко под предыдущими iOS.
Novlex

Для завершения (это лучший результат Google), я хотел бы отметить, что загадочная ошибка неизменна в OSX 10.11.3 - и вызвана, как говорит Роб, наличием функции рисования вне drawRect или другого контекста. связанная функция.
green_knight

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

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

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


Итак… добавляя символическую точку останова в CGPostError, как можно посмотреть на размер в этой точке?
Cris

Вы можете просмотреть стек вызовов функций в «Показать навигацию отладки» командой + 6. затем вы нажимаете на дерево, затем вы можете вернуться к своей функции, чтобы просмотреть переменную.
lbsweek

Да, я передавал изображение, чтобы сделать это изображение круглым, но обнаружил, что его размер равен нулю. Наконец-то решился через 2 дня: D.
JiteshW

19

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

Просто сделать:

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

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


16

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

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

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


5

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

    #import <QuartzCore/QuartzCore.h>

5

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

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


4

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

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

2

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

Решения (если делать нестандартный рисунок):

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

2

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


2

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


2

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

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

Вот код, который наконец-то работал с моими комментариями (код 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()
}

2

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

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

1
Была точно такая же проблема. По-видимому, вы должны покинуть хотя бы
одну

1

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

    UIGraphicsBeginImageContext (размер);
    CGContextRef context = UIGraphicsGetCurrentContext ();

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

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

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

Поэтому я удалил содержимое производных данных, перезапустил мой XCode. И это сработало.


Каково решение тогда?
Компьютерщик

1
@ Гик, обновленное решение. Удалите содержимое DerivedData и перезапустите.
Встречайте

1

У меня та же проблема. В моем проекте я попытался создать 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 не работает . И спасибо помощнику.


1

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

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

Мир замолчал


0

Для меня ответ состоял в том, что я излишне выпускал графический контекст в drawRect:. Создание символической точки останова на CGPostError указало мне на виновника.


0

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

textfield.delegate = self

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


0

У меня была эта проблема в 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
}

0

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

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

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

//    CGContextRelease(context);
}

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


0

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

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

Печатание правильного изображения решило это для меня.



0

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

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

Кажется, это влияет только на 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 затронута.

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


0

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


0

Это хакерство, но у меня это сработало.

Я установил UIImageViewв UITableViewCell'ы' init, дать ему размер и ограничения.

Затем, на мой взгляд, контроллер cellForRowAtIndexPathя делаю это:

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.