неверный контекст 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 был выпущен для разработчиков. Мне любопытно посмотреть, пройдет ли это, или станет хуже, или может быть решена.

Ælex
источник
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, я больше не могу воспроизвести ошибку, дважды нажав внутри пустого текстового поля.

bilobatum
источник
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 для проверки

lbsweek
источник
Итак… добавляя символическую точку останова в 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];
Collin
источник
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>}
jamone
источник
2

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

JuJoDi
источник
2

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

Nagarjun
источник
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];
balkoth
источник
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];

Мир замолчал

wossoneri
источник
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

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

Nagarjun
источник
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 затронута.

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

RS-232
источник
0

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

Chuyang
источник
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. Код выше является хорошим значением по умолчанию

Зак Шапиро
источник