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