недійсний контекст 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
Це відбувається зі мною .. Я скидаю uitextfield на IB, отримую, що помилка і клавіатура не з’являється .. чи є якесь рішення ?? Спасибі
Фрейд

@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, таких як той, що починає і закінчує контекст).

Сказавши, що білобатум є правильним, що саме ця послідовність помилок може бути наслідком помилки iOS 7, на яку він посилається у своїй відповіді. Якщо ви не бачите цих помилок у ваших цілях iOS6 або якщо після швидкого сканування цього приватного фреймворку ви не знайдете жодних підозрюваних викликів Core Graphics, це може бути саме ця помилка iOS 7. Гарний улов, білобатум!


У мене є погляд у приватній системі, яка викликає drawRect. Хоча я безпосередньо не називаю жоден із згаданих методів, моє єдине припущення полягає в тому, що код цього класу якимось чином пов'язаний. Однак, як я вже згадував, усе працює безперебійно під попередніми iOS.
Ælex

Для завершення (це головний результат google), я хочу зазначити, що криптовалютська помилка не змінюється в OSX 10.11.3 - і викликана, як каже Роб, функцією малювання поза drawRect або іншим контекстом, пов'язана функція.
green_knight

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

переконайтесь, що size.width або size.height не дорівнює 0,

ви можете додати точку розриву символу до CGPostError, щоб перевірити


так що… додаючи символічну точку розриву на CGPostError, як можна подивитися розмір у цій точці?
Крис

ви можете переглянути стек виклику функцій у "показати навігаційну помилку" за допомогою команди + 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 (), який за замовчуванням в користувацькому шарі є нульовим. Онлайн - документація пояснює це дуже ясно -

Якщо для малювання ви не використовуєте об'єкт 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()
}

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 точку області, де зображення може розтягнутися
ribeto

1

Я створював UIImage з контексту за допомогою наведеного нижче коду:

    UIGraphicsBeginImageContext (розмір);
    CGContextRef контекст = UIGraphicsGetCurrentContext ();

    CGContextSetFillColorWithColor (контекст, колір.CGColor);
    CGContextFillRect (контекст, (CGRect) {. Size = size});

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

Таким чином, я отримував помилку.

Тому я видалив вміст отриманих даних, перезапустив свій XCode. І це спрацювало.


Яке рішення тоді?
Geek

1
@Geek, оновлене рішення. Видаліть вміст 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 plus, але я не вірю, що на iOS 8 це впливає.

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


0

Якщо помилка виникає, коли ви використовуєте UIBezierPath і встановлюєте колір для обведення або заливки, поставте встановлений колірний код у функцію drawRect, а не в інші місця.


0

Це хакі, але це працювало на мене.

Я встановив UIImageViewв UITableViewCell'' s 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.