iOS 7.0 및 시스템 성능 저하에서 유효하지 않은 컨텍스트 0x0


218

나는이 두려운 문제에 대해 찾을 수있는 많은 검색 결과를 읽었습니다. 불행히도 각각은 특정 함수 호출에 집중하는 것 같습니다.

내 문제는 여러 함수에서 동일한 오류가 발생한다는 것입니다.이 함수는 내가 사용하는 함수에서 다시 호출되는 것 같습니다.

설상가상으로 실제 코드는 다른 프로젝트에서 가져 오는 사용자 정의 개인 프레임 워크 내에 있으며 디버깅이 간단하지 않습니까?

누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 특정 메소드를 잘못 호출하거나 컨텍스트가 잘못되었다는 느낌이 들지만 xcode의 출력은 그다지 도움이되지 않습니다.

: CGContextSetFillColorWithColor : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

: CGContextSetStrokeColorWithColor : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

CGContextSaveGState : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

: CGContextSetFlatness : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

: CGContextAddPath : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

: CGContextDrawPath : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

: CGContextRestoreGState : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

: CGContextGetBlendMode : 유효하지 않은 컨텍스트 0x0. 이것은 심각한 오류입니다. 이 응용 프로그램 또는 사용하는 라이브러리가 유효하지 않은 컨텍스트를 사용하므로 시스템 안정성과 안정성이 전반적으로 저하됩니다. 이 통지는 예의입니다 :이 문제를 해결하십시오. 다음 업데이트에서 치명적인 오류가됩니다.

이러한 오류는 사용자 정의보기가 제공되거나 상속 된 클래스 중 하나 일 때 발생할 수 있습니다. 어떤 시점에서 키보드가 입력을 제공하지 않을 때까지 여러 번 생성됩니다. 터치 이벤트는 계속 등록되지만 시스템 속도가 느려져서 할당되지 않은 개체 오류가 발생할 수 있습니다.

편집 # 1 : 가져 오는 프레임 워크에 액세스 할 수 있지만 클래스에서 문제를 일으키는 이상한 점은 없습니다.

편집 # 2 : 개발자 용 iOS 7.1이 릴리스되었다는 이메일을 받았습니다. 이것이 사라지거나 더 나빠지거나 해결할 수 있는지 궁금합니다.


8
양식의 표준 텍스트 상자에서 앱에 이와 동일한 오류가 발생합니다. 키보드가 표시되는 동안 텍스트 상자를 여러 번 누르면이 오류가 나타납니다.

여기도 마찬가지입니다. 때때로이 로그 중 수백 개, 때로는 0입니다. 나는 drawRect를 재정의하기 때문이라고 생각했지만 다른 것 같습니다. 지금은 무시합니다.
Krumelur

2
방금 developer.apple.com (Apple에서 제안한 코드 복사)에 대한 첫 번째 튜토리얼을 마쳤으며 동일한 오류가 발생합니다. 숙련 된 프로그래머가 해당 자습서를 보면이 문제의 원인을 추적 할 수 있습니다.
Antonio Sesto 2012

1
아래 참조 (사용자 정의 UI 요소를 사용하는보기에서 자동 레이아웃 끄기)
JuJoDi

1
2016 년에도 여전히 발생하지만 (XCode 7, iOS 9.2) 여전히 큰 피해는 없습니다.
Hatchmaster J

답변:


162

다른 사람들은 핵심 그래픽 컨텍스트에 액세스하는 코드를 게시하라는 메시지를 표시하지만 문제가 의심됩니다. 이 잘못된 컨텍스트 0x0 오류 메시지는 iOS 7에서 일반적이고 재현하기 쉽습니다. 실제로, 코드가없는 스토리 보드를 사용하여 오류를 재현 할 수 있습니다. UITextField를 IB의 캔버스로 드래그하고 앱을 실행 한 다음 텍스트 필드 내부를 두 번 탭합니다.

많은 상황에서 잘못된 컨텍스트 0x0 오류 메시지를 심각하게 받아들이 기 어렵습니다. 귀하의 상황이 더 큰 관심사를 필요로하는지 모르겠습니다 (특히 그래픽 컨텍스트를 명시 적으로 사용하는 경우 조사 할 가치가 있음을 Rob Napier에 동의합니다).

내 프로젝트에서 이러한 오류 중 많은 부분이 언젠가 마술처럼 사라지기를 바라고 있습니다 (그러나 그 날에는 7.0.3이 나오지 않았습니다).

업데이트 : Xcode 5.1을 설치하고 iOS 7.1을 대상으로 한 후 빈 텍스트 필드 내부를 두 번 눌러 오류를 재현 할 수 없습니다.


10
이 iOS 7 UITextField 버그에 대해 완전히 맞습니다. 그래도 레이더를 열어야합니다 (bugreport.apple.com). 그러나 이것이 문제라고 생각하기에는 너무 빠르지 않습니다. 커스텀 뷰이기 때문에 먼저 @Rob의 요점을 조사해 볼 가치가 있습니다.
Rob Napier

2
나는 나에게 일어나고있다. 나는 IB에 uitextfield를 떨어 뜨리고, 그 에러를 얻었고 키보드는 나타나지 않는다. 감사합니다
Frade

@Frade 저에게는 키보드가 나타나고 엄격한 오류 메시지에도 불구하고 앱이 정상적으로 실행됩니다. 따라서 추가 문제가있을 수 있습니다.
bilobatum

3
나도 같은 문제가 있습니다. 또한 시뮬레이터에서만 발생하지만 버그가 발생하면 Mac 키보드를 사용하여 시뮬레이터에 입력 할 수 없으며 화면 키보드를 사용해야하므로 매우 실망 스럽습니다. 내 응용 프로그램에서는 사용자 정의보기를 사용하지 않으므로 CG 컨텍스트를 수동으로 만들거나 사용하지 마십시오.

1
그것에 대해 감사합니다, 나는 그것이 잘못 된 내 응용 프로그램이라고 생각했습니다! 당신은 완전히 옳습니다. 텍스트 필드를 두 번 클릭 하여이 오류가 발생했습니다.
Ash

201

어떤 코드가 이러한 로그를 발생시키는 지 궁금한 경우 에 기호 중단 점추가 할 수 있습니다CGPostError .


2
CGPostError에 대한 팁을 주셔서 감사합니다. 나는 그것에 중단 점을 두었고이 문제를 일으키기 위해 아무것도하지 않는 것처럼 보입니다. 내 경우에는 메인 스레드에서 발생하지만 내 코드에서는 발생하지 않습니다.
Paul Heller

10
이 특정 사례에서는 해결책은 아니지만 프로그래머 자신의 코드 범위 내에있을 때 오류가있는 위치를 강조 할 수 있기 때문에이 문제를 해결하십시오.
Ash

27
이것은 좋은 제안입니다. 상징적 중단 점에 익숙하지 않거나 Xcode에 추가하는 방법에 대한 Apple의 문서는 다음과 같습니다. developer.apple.com/library/ios/recipes/…
Tony Adams

이것은 나를 도왔다. 제 경우에는 OS X 앱의 뷰에 NSGradient 추가를 강조했습니다.
Aaron Vegh

1
특정보기를 위해 프레임을 설정하기 전에 그림을 그리는 것처럼 보입니다. 감사합니다! :)
Rick van der Linde

42

오류의 이러한 종류의 역사적하지 않을 때 내 설립되는 컨텍스트 내에서 코어 그래픽 함수를 호출의 결과 drawRect또는 같은 호출 사이 UIGraphicsBeginImageContextUIGraphicsEndImageContext(시작 컨텍스트를 종료하는 같은 또는 다른 UIKit 기능).

그러나 bilobatum은이 특정 순서의 오류가 그가 답변에서 언급 한 iOS 7 버그의 결과 일 수 있다고 정확합니다. iOS6 대상에서 이러한 오류가 표시되지 않거나이 개인 프레임 워크를 빠르게 스캔 한 후 Core Graphics 호출이 의심되는 경우이 iOS 7 버그 일 수 있습니다. 잘 잡아라, bilobatum!


개인 프레임 워크에서 drawRect를 호출하는 관점이 있습니다. 언급 된 메소드를 직접 호출하지는 않지만 해당 클래스의 코드가 어떻게 든 관련되어 있다고 가정합니다. 그러나 앞에서 언급했듯이 모든 것은 이전 iOS에서 원활하게 실행됩니다.
Ælex

완료를 위해 (이것은 최고의 Google 결과입니다), OSX 10.11.3에서 암호 오류가 변경되지 않았으며 Rob이 말한 것처럼 drawRect 또는 다른 컨텍스트 외부에서 그리기 기능을 사용하여 발생했습니다. 관련 기능.
green_knight

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

size.width 또는 size.height가 0이 아닌지 확인하십시오.

CGPostError에 기호 중단 점을 추가하여 확인할 수 있습니다.


CGPostError에 상징적 인 중단 점을 추가하면, 그 시점에서 어떻게 크기를 볼 수 있습니까?
Cris

command + 6로 "디버그 탐색 표시"에서 함수 호출 스택을 볼 수 있습니다. 그런 다음 트리를 클릭하면 함수로 돌아가 변수를 볼 수 있습니다.
lbsweek

예, imagview를 원형으로 만들기 위해 imageview를 전달했지만 크기가 0이라는 것을 알았습니다. 마지막으로 2 일 후에 해결되었습니다 : D.
JiteshW

19

간단한 UITextField (키보드가 표시되지 않고 콘솔에 잘못된 컨텍스트 오류 메시지가 많이 있음)와 함께이 문제가 발생했습니다. 방금 SO에 대한 다른 문제를 찾아 해결책을 찾았습니다. CFBundle CertUIFramework.axbundle에 대한 실행 파일을 찾을 수 없습니다

그냥 해:

iOS 시뮬레이터> 컨텐츠 및 설정 재설정 ...을 클릭하고 다시 실행하십시오.

더 이상 문제가 없어야합니다


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

정답 : 문제는 - (void)drawRect:(CGRect)rect이 방법 외에 CGContext 등과 같은 핵심 그래픽 요소를 사용했기 때문 입니다.

이제 친절하게 코드를이 방법으로 옮기십시오. 그리고 경고 / 오류가 발생합니다.


4

CATextLayer 개체에서 사용되는 NSAttributedString 사전의 특성으로 UIColor 개체를 사용했기 때문에이 오류가 발생했습니다. CGColorRef를 보유하도록 사전을 변경했으며 오류가 사라졌습니다.

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

2

나는 문맥에서 반환 된 경우에 있었다 UIGraphicsGetCurrentContext()입니다 NULL당신은 아무것도에 대한이 메시지가 나타납니다 그것을 사용하려고하면합니다. 컨텍스트를 아직 설정하지 않은 상태에서 직접 호출 하는 대신 UIGraphicsPushContext을 호출하기 전에 컨텍스트를 푸시하는 것은보기의 책임 입니다. 내 직감은 iOS 7 이전에 컨텍스트가에 대한보기로 푸시 되었으며 이제 iOS 7에서 처음 호출 될 때까지 컨텍스트가 푸시되지 않는다는 것입니다. 일부 UIKit 코드가 직접 호출되는 것으로 의심 되므로 사용자 지정 드로잉을 수행하지 않아도 일부 코드에 문제가 있습니다.drawRect:drawRect:[view setNeedsDisplay]initdrawRect:drawRect:

솔루션 (사용자 정의 드로잉을 수행하는 경우) :

  1. drawRect:직접 전화 하거나 사용 하지 않거나 [view setNeedsDisplay]즉시 도면을 사용해야하는 경우[view.layer draw]
  2. 당신 drawRect:의 컨텍스트를 얻지만이 if 문의 본문 밖에서 사용하지 마십시오if (context) {<do drawing here>}

2

영향을받는 뷰에서 자동 레이아웃을 끄면 뷰 내에서 UI 요소 (특히 프로그래밍 방식으로 그려진 사용자 정의 요소)를 배치하고 이동할 경우이 오류가 사라집니다. 이 증상을 발견했을 때 JVFloatLabeledTextField를 사용하고있었습니다.


2

경우에 따라 회선을 포함해야 할 수도 있습니다 #import <QuartzCore/QuartzCore.h>.


2

사용자 지정 CALayer 구현의 drawInContext (..) 메서드에서이 오류가 발생했습니다. UIBezierPath는 사용자 정의 레이어에서 기본적으로 nil 인 UIGraphicsGetCurrentContext ()를 사용하려고합니다. 온라인 문서는 매우 명확하게 설명 -

그러나 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

필자의 경우 캡 삽입이 가능한 resible 이미지를 만들 때이 경고가 발생했습니다. 문제는 "자르지 않은"영역에 최소 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 (size);
    CGContextRef 컨텍스트 = UIGraphicsGetCurrentContext ();

    CGContextSetFillColorWithColor (컨텍스트, color.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

UIActivity 서브 클래스의 activityImage 메소드에서 이미지 이름을 잘못 입력했을 때 얻었습니다.

- (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 = @" ";

    }
}

아이폰 4s, 5 및 5s의 iOS 7.0.3 시뮬레이터에서 이것을 테스트했지만 더 이상 경고가 표시되지 않습니다. 나는 또한 iphone 6 및 6 plus의 iOS 8 시뮬레이터에서 이것을 테스트했지만 iOS 8이 영향을받지 않는다고 생각합니다.

이 문제를 발견하기 전에 이틀간의 좌절을 겪었으므로 같은 문제를 겪고있는 사람들에게 도움이되기를 바랍니다.


0

UIBezierPath를 사용하고 스트로크 또는 채우기 색상을 설정할 때 오류가 발생하면 설정된 색상 코드를 다른 위치가 아닌 drawRect 함수에 넣으십시오.


0

이것은 해 키지 만 그것은 나를 위해 일했습니다.

나는를 설정 UIImageViewUITableViewCellinit , 그것을 크기와 제약 조건을 제공합니다.

그런 다음 내 뷰 컨트롤러 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. 위의 코드는 좋은 기본값입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.