niepoprawny kontekst 0x0 w iOS 7.0 i degradacja systemu

218

Przeczytałem tyle wyników wyszukiwania, które mogłem znaleźć na temat tego przerażającego problemu, niestety, każdy wydaje się koncentrować na konkretnym wywołaniu funkcji.

Mój problem polega na tym, że otrzymuję ten sam błąd z wielu funkcji, które, jak sądzę, są wywoływane z funkcji, których używam.

Co gorsza, rzeczywisty kod znajduje się w niestandardowym frameworku prywatnym, który jest importowany w innym projekcie, a zatem debugowanie nie jest tak proste?

Czy ktoś może wskazać mi właściwy kierunek? Mam wrażenie, że nazywam niektóre metody niepoprawnie lub w złym kontekście, ale dane wyjściowe z xcode nie są w tym momencie bardzo pomocne.

: CGContextSetFillColorWithColor: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

: CGContextSetStrokeColorWithColor: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

CGContextSaveGState: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

: CGContextSetFlatness: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

: CGContextAddPath: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

: CGContextDrawPath: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

: CGContextRestoreGState: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

: CGContextGetBlendMode: nieprawidłowy kontekst 0x0. To poważny błąd. Ta aplikacja lub używana przez nią biblioteka korzysta z nieprawidłowego kontekstu i tym samym przyczynia się do ogólnego pogorszenia stabilności i niezawodności systemu. To powiadomienie jest uprzejme: napraw ten problem. W nadchodzącej aktualizacji stanie się to fatalnym błędem.

Błędy te mogą wystąpić, gdy prezentowany jest widok niestandardowy lub jedna z jego odziedziczonych klas. W tym momencie odradzają się wiele razy, dopóki klawiatura nie zapewni żadnych danych wejściowych. Zdarzenia dotykowe są nadal rejestrowane, ale system zwalnia i ostatecznie może prowadzić do nieprzydzielonych błędów obiektu.

EDYCJA 1: Mam dostęp do importowanego frameworka, ale nie widzę nic dziwnego w klasach, które powodują problem.

EDYCJA 2: Właśnie otrzymałem wiadomość e-mail z informacją, że iOS 7.1 został wydany dla programistów. Jestem ciekawy, czy to zniknie, pogorszy się, czy da się rozwiązać.

Ælex
źródło
8
Ten sam błąd pojawia się w naszej aplikacji - ze standardowego pola tekstowego w formularzu. Jeśli dotkniesz pola tekstowego wiele razy podczas wyświetlania klawiatury, pojawi się ten błąd.
To samo tutaj. Czasem setki tych dzienników, czasem zero. Myślałem, że to dlatego, że nadpisuję remis: ale wydaje się, że jest to coś innego. Ignorowanie tego na razie.
Krumelur
2
Właśnie ukończyłem pierwszy samouczek na developer.apple.com (kopiowanie kodu sugerowanego przez Apple) i otrzymuję ten sam błąd. Być może, jeśli bardziej doświadczeni programiści spojrzą na ten samouczek, będą w stanie wyśledzić przyczynę tego problemu.
Antonio Sesto
1
Zobacz poniżej (wyłącz autolayout w widokach, w których używasz niestandardowych elementów interfejsu użytkownika)
JuJoDi
1
Nadal dzieje się w 2016 r. (XCode 7, iOS 9.2), nadal nie widać żadnych wyrządzonych szkód.
Hatchmaster J

Odpowiedzi:

162

Inni będą prosić o opublikowanie kodu w miejscu, w którym uzyskujesz dostęp do podstawowego kontekstu graficznego, ale wątpię, czy to jest problem. Te niepoprawne kontekstowe komunikaty o błędach 0x0 są powszechne i łatwe do odtworzenia w iOS 7. W rzeczywistości mogę odtworzyć błąd za pomocą scenorysu z zerowym kodem. Przeciągam UITextField na obszar roboczy w IB, uruchamiam aplikację i dwukrotnie stukam w pole tekstowe.

W wielu sytuacjach ciężko jest mi poważnie traktować nieprawidłowe komunikaty o błędach 0x0. Nie wiem, czy twoja sytuacja wymaga większego zaniepokojenia (zgadzam się z Robem Napierem, że warto to zbadać, zwłaszcza jeśli wyraźnie używasz kontekstu graficznego).

W moich własnych projektach mam nadzieję, że wiele z tych błędów magicznie zniknie pewnego dnia (ale ten dzień nie przyszedł z wersją 7.0.3).

Aktualizacja: po zainstalowaniu Xcode 5.1 i celowaniu w iOS 7.1 nie mogę już odtworzyć błędu przez dwukrotne dotknięcie pustego pola tekstowego.

bilobatum
źródło
10
Masz całkowitą rację co do tego błędu UITextField dla iOS 7. Pamiętaj jednak, aby otworzyć dla niego radar (bugreport.apple.com). Ale nie spiesz się zbyt szybko, by założyć, że o to tu chodzi. Ponieważ jest to widok niestandardowy, warto najpierw zbadać punkty @ Rob.
Rob Napier
2
To mi się przydarza. Upuszczam uitextfield na IB, dostaję błąd i klawiatura się nie pojawia .. czy jest jakieś rozwiązanie? Dzięki
Frade
@Frade Dla mnie pojawia się klawiatura, a aplikacja działa normalnie pomimo surowego komunikatu o błędzie. Więc możesz mieć dodatkowy problem.
bilobatum
3
Mam również ten sam problem. Zdarza się to również w symulatorze, ale zauważyłem, że kiedy dostaję błąd, nie mogę używać klawiatury Mac do pisania w symulatorze i muszę używać klawiatury ekranowej, co jest bardzo frustrujące. W mojej aplikacji nie używam żadnych niestandardowych widoków, więc nigdy nie tworzę ręcznie ani nie używam kontekstu CG.
1
Dzięki Bogu za to, myślałem, że to wina mojej aplikacji! Masz jednak całkowitą rację; dwukrotne kliknięcie w polu tekstowym również spowodowało ten błąd.
Ash
201

Jeśli jesteś ciekaw, jaki kod jest przyczyną tych dzienników, można dodać symboliczną przerwania na CGPostError.

Art Gillespie
źródło
2
Dzięki za wskazówkę na temat CGPostError. Położyłem na nim punkt przerwania i wygląda na to, że nie robię nic, aby spowodować ten problem. W moim przypadku dzieje się to w głównym wątku, ale nie w moim kodzie.
Paul Heller,
10
Głosuj na to, ponieważ chociaż nie jest to rozwiązanie w tym konkretnym przypadku, BĘDZIE często podkreślać, gdzie leży usterka, gdy jest ona objęta zakresem własnego kodu programisty.
Ash
27
To świetna sugestia. Dla tych, którzy nie są zaznajomieni z symbolicznymi punktami przerwania lub jak je dodać w Xcode, oto dokumentacja Apple na ten temat. developer.apple.com/library/ios/recipes/…
Tony Adams
To mi pomogło. W moim przypadku podkreśliłem dodanie NSGradient do widoku w mojej aplikacji OS X.
Aaron Vegh,
1
Wygląda na to, że rysowałem przed ustawieniem ramki dla określonego widoku, dziękuję! :)
Rick van der Linde
42

Tego rodzaju błędy są historycznie wynikiem wywoływania funkcji Core Graphics, gdy nie znajdują się one w kontekście ustanowionym w ramach drawRectlub pomiędzy wywołaniami takimi jak UIGraphicsBeginImageContexti UIGraphicsEndImageContext(lub innymi funkcjami UIKit, które rozpoczynają i kończą kontekst).

Powiedziawszy to jednak, bilobatum ma rację, że ta szczególna sekwencja błędów może być wynikiem tego błędu iOS 7, do którego odwołuje się w swojej odpowiedzi. Jeśli nie widzisz tych błędów w swoich celach iOS6 lub jeśli po szybkim skanowaniu tego prywatnego środowiska nie znajdziesz żadnych podejrzanych wywołań Core Graphics, może to być po prostu ten błąd iOS 7. Dobry połów, bilobatum!

Obrabować
źródło
Mam pogląd w ramach prywatnych, które wywołują funkcję drawRect. Chociaż nie wywołuję bezpośrednio żadnej z wymienionych metod, moim jedynym założeniem jest to, że kod w tej klasie jest w jakiś sposób powiązany. Jednak, jak wspomniałem, wszystko działa bezproblemowo w poprzednich wersjach iOS.
Ælex
Ze względu na zakończenie (jest to najlepszy wynik w Google), chciałbym zauważyć, że błąd kryptyczny nie zmienia się w OSX 10.11.3 - i spowodował, jak mówi Rob, funkcję rysowania poza drawRect lub innym kontekstem - powiązana funkcja.
green_knight
26
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

upewnij się, że rozmiar. szerokość lub rozmiar. wysokość nie jest równa 0,

możesz dodać punkt przerwania symbolu do CGPostError, aby sprawdzić

lbsweek
źródło
więc… dodając symboliczny punkt przerwania w CGPostError, jak można w tym momencie spojrzeć na rozmiar?
Cris,
możesz wyświetlić stos wywołań funkcji w „pokaż nawigację debugowania” za pomocą polecenia + 6. następnie kliknij drzewo, a następnie możesz wrócić do swojej funkcji, aby wyświetlić zmienną.
lbsweek
Tak, przechodziłem do podglądu obrazu, aby ten widok był okrągły, ale stwierdziłem, że jego rozmiar wynosił zero. Ostatecznie rozwiązany po 2 dniach: D.
JiteshW,
19

Miałem ten problem z prostym polem UITextField (klawiatura nie wyświetla się i wiele różnych komunikatów o błędach kontekstowych na konsoli). Właśnie znalazłem obejście, szukając innego problemu na SO: Nie można znaleźć pliku wykonywalnego dla CFBundle CertUIFramework.axbundle

Po prostu zrób:

kliknij Symulator iOS> Zresetuj zawartość i ustawienia ... i uruchom ponownie.

Problem nie powinien już istnieć

Kevin Delord
źródło
16

W moim przypadku mam następujące błędy w tym kodzie:

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

po kilku przemyśleniach i teście wykrywam problem - oto połączenie:

[path fill];

jak wykrywam - w moim kodzie to wywołanie nie jest konieczne, ponieważ wypełnienie zostanie wykonane w inny sposób - więc po prostu je usuwam.

Denis Kozhukhov
źródło
5

Miałem ten sam problem i zapomniałem zaimportować QuartzCore / QuartzCore.h, To rozwiązało mój problem z tymi błędami.

    #import <QuartzCore/QuartzCore.h>
David Roop
źródło
5

Prosta odpowiedź: Problem polega na tym, że użyłeś podstawowych elementów graficznych, takich jak CGContext itp., W innej niż - (void)drawRect:(CGRect)rectta metoda.

Teraz uprzejmie przenieś swój kod do tej metody. I będzie strop dając ostrzeżenia / błędy.


źródło
4

Otrzymałem ten błąd, ponieważ użyłem obiektu UIColor jako atrybutu w słowniku NSAttributString, który był używany w obiekcie CATextLayer. Zmieniłem słownik na CGColorRef i błąd zniknął.

[wordAttributes setObject:(id)[UIColor whiteColor].CGColor forKey:(NSString*)kCTForegroundColorAttributeName];
Collin
źródło
2

Miałem przypadki, w których kontekst wróciłem z UIGraphicsGetCurrentContext()to NULL, a jeśli spróbujesz go używać do niczego to pojawia się komunikat. Widok odpowiada za użycie kontekstu UIGraphicsPushContextprzed wywołaniem drawRect:, jeśli zadzwonisz drawRect:bezpośrednio zamiast [view setNeedsDisplay]ryzykować, że kontekst nie zostanie jeszcze ustawiony. Mam przeczucie, że przed iOS 7 kontekst był wypychany do widoku init, a teraz w iOS 7 kontekst nie jest wypychany aż do pierwszego drawRect:wywołania. Podejrzewam, że jakiś kod UIKit wywołuje drawRect:bezpośrednio i dlatego występują problemy z niektórymi kodami, nawet jeśli nie jest wykonywany rysunek niestandardowy.

Rozwiązania (w przypadku rysowania niestandardowego):

  1. Nie dzwoń drawRect:bezpośrednio, używaj [view setNeedsDisplay]lub jeśli potrzebujesz natychmiastowego użycia rysunku[view.layer draw]
  2. W swoim drawRect:kontekście, ale nie używaj go poza treścią instrukcji ifif (context) {<do drawing here>}
jamone
źródło
2

Wyłączenie automatycznego układania w dotkniętym widoku powoduje, że ten błąd znika w niektórych przypadkach, w których umieszczasz i przenosisz elementy interfejsu użytkownika (zwłaszcza te niestandardowe, które są rysowane programowo) w widoku. Kiedy odkryłem ten objaw, użyłem JVFloatLabeledTextField.

JuJoDi
źródło
2

W niektórych przypadkach może być konieczne dołączenie wiersza #import <QuartzCore/QuartzCore.h>.

Nagarjun
źródło
2

Ten błąd wystąpił w metodzie drawInContext (..) mojej niestandardowej implementacji CALayer. UIBezierPath próbuje użyć UIGraphicsGetCurrentContext (), która domyślnie jest zerowa w warstwie niestandardowej. Dokumentacja online wyjaśnia to bardzo wyraźnie -

Jeśli jednak nie używasz obiektu UIView do rysowania, musisz ręcznie wcisnąć prawidłowy kontekst na stos za pomocą funkcji UIGraphicsPushContext.

Oto kod, który w końcu zadziałał z moimi komentarzami (kod Swift, ale rozwiązanie jest takie samo niezależnie)

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()
}
inder
źródło
2

W moim przypadku pojawiało się to ostrzeżenie podczas tworzenia obrazu resible z wypustkami nakładki. Problem polegał na tym, że nie zostawiałem co najmniej 1 piksela w obszarze „nieograniczonego”.

    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];
bałtyk
źródło
1
Miał dokładnie ten sam problem. Najwyraźniej musisz zostawić co najmniej 1 punkt obszaru, w którym obraz może się rozciągnąć
żebro
1

Tworzyłem UIImage z kontekstu, używając poniższego kodu:

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

    CGContextSetFillColorWithColor (kontekst, kolor.CGColor);
    CGContextFillRect (kontekst, (CGRect) {. Size = size});

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

W ten sposób otrzymywałem błąd.

Więc usunąłem dane pochodne, zrestartowałem mój XCode. I zadziałało.

Spotykać się
źródło
Jakie jest zatem rozwiązanie?
Geek
1
@Geek, zaktualizowane rozwiązanie. Usuń zawartość DerivedData i uruchom ponownie.
Spotkaj się
1

Mam ten sam problem. W moim projekcie próbuję utworzyć pole tekstowe i dodać go do mojego pliku pdf. Stary kod:

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

Po rozwiązaniu tego problemu kod zmienił się:

old:[[UIColor blackColor] setFill]; 

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

Znalazłem rozwiązanie w UIColor SetFill nie działa . I dziękuję pomocnikowi.

Kate
źródło
1

Mam błąd z kodem

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;

i po usunięciu kodu

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

Świat ucichł

wossoneri
źródło
0

Dla mnie odpowiedzią było, że niepotrzebnie zwalniałem kontekst graficzny w drawRect:. Rzucenie symbolicznego punktu przerwania na CGPostError wskazało mi winowajcę.

Taylor Halliday
źródło
0

Dostałem ten błąd, jak ustawiłem

textfield.delegate = self

Bez implementacji żadnej z procedur delegowania. Usunięcie tej linii rozwiązało problem dla mnie

Daniel Åkesson
źródło
0

Miałem ten problem w polu UITextField, kiedy dotknąłem pustego pola tylko tekstem zastępczym. Użyłem następujących obejść, aby wyeliminować puste pola:

-(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
}
Peter B. Kramer
źródło
0

Dla mnie pojawiał się ten błąd, ponieważ zwalniałem CGContextRef, jak pokazano poniżej:

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

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

//    CGContextRelease(context);
}

Usunięcie wydania rozwiązało problem

Kyle Redfearn
źródło
0

Mam go, gdy pomyliłem nazwę obrazu w metodzie activityImage w podklasie UIActivity

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

Wpisanie odpowiedniego obrazu rozwiązało to dla mnie.

Saleh Albuga
źródło
0

Odinstaluj aplikację z symulatora i uruchom ponownie

Nagarjun
źródło
0

Podobnie jak inni, którzy tutaj skomentowali, otrzymałem to ostrzeżenie, gdy wykonałem jedną z następujących czynności:

W pustym polu tekstowym: Podwójne stuknięcie, dotknij i przytrzymaj, długie pojedyncze stuknięcie.

Wydaje się, że dotyczy to tylko iOS 7.0.3

Odkryłem obejście, ostrzeżenie nie zostanie uruchomione, jeśli twój karton nie ma wartości NULL.

Więc zrobiłem następujące w textFieldDidBeginEditing:

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

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

        pasteboard.string = @" ";

    }
}

Przetestowałem to w symulatorze dla iOS 7.0.3 na iPhone'ach 4s, 5 i 5s i nie otrzymuję już ostrzeżenia. Przetestowałem to również w symulatorze dla systemu iOS 8 na iPhonie 6 i 6 plus, ale nie sądzę, aby miało to wpływ na iOS 8.

Przeszedłem przez dwa dni frustracji, zanim odkryłem tę pracę, więc mam nadzieję, że moja odpowiedź pomoże tym z was, którzy mają ten sam problem.

RS-232
źródło
0

Jeśli błąd występuje podczas korzystania z UIBezierPath i ustawiania koloru dla obrysu lub wypełnienia, należy ustawić ustawiony kod koloru w funkcji drawRect zamiast w innych miejscach.

Chuyang
źródło
0

To jest hacky, ale zadziałało dla mnie.

I skonfigurować UIImageVieww UITableViewCell„s init, nadać jej rozmiar i ograniczeń.

Następnie w moim kontrolerze widoku cellForRowAtIndexPathrobię to:

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

I to pozwala uniknąć błędu, a następnie poniżej tej funkcji ustawiam dla tego rzeczywisty obraz UIImageView. Powyższy kod jest dobrym ustawieniem domyślnym

Zack Shapiro
źródło