iOS 7.0での無効なコンテキスト0x0とシステムの劣化


218

私はこの恐ろしい問題について見つけることができる多くの検索結果を読みましたが、残念ながら、それぞれが特定の関数呼び出しに焦点を当てているようです。

私の問題は、複数の関数から同じエラーが発生することです。これは、使用している関数からコールバックされていると思います。

さらに悪いことに、実際のコードはカスタムプライベートフレームワーク内にあり、別のプロジェクトにインポートされているため、デバッグはそれほど単純ではありませんか?

誰かが私を正しい方向に向けることができますか?特定のメソッドを間違って、または不適切なコンテキストで呼び出しているように感じますが、現時点では、xcodeからの出力はあまり役に立ちません。

:CGContextSetFillColorWithColor:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

:CGContextSetStrokeColorWithColor:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

CGContextSaveGState:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

:CGContextSetFlatness:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

:CGContextAddPath:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

:CGContextDrawPath:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

:CGContextRestoreGState:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

:CGContextGetBlendMode:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーションまたはそれが使用するライブラリは、無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下の原因となっています。この通知は礼儀です:この問題を修正してください。今後のアップデートで致命的なエラーになります。

これらのエラーは、カスタムビューまたはその継承クラスの1つが表示されたときに発生する可能性があります。その時点で、キーボードが入力を提供しなくなるまで、それらは複数回スポーンします。タッチイベントはまだ登録されていますが、システムの速度が低下し、最終的に未割り当てのオブジェクトエラーが発生する可能性があります。

編集#1:インポートされているフレームワークにアクセスできますが、問題の原因となっているクラスに奇妙なものは何もありません。

編集#2: iOS 7.1が開発者向けにリリースされたというメールを受信しました。これがなくなるか、悪化するか、解決できるかどうか知りたいです。


8
アプリでも同じエラーが発生します-フォームの標準テキストボックスから。キーボードが表示されているときにテキストボックスを複数回タップすると、このエラーが表示されます。

こっちも一緒。これらのログの数百、時にはゼロ。これは、drawRectをオーバーライドしているためだと思いましたが、それは別のようです。現時点では無視しています。
Krumelur 14

2
developer.apple.comの最初のチュートリアル(Appleが提案したコードのコピー)を終了したところ、同じエラーが発生しました。より経験豊富なプログラマがそのチュートリアルを見ると、この問題の原因を追跡できる場合があります。
アントニオセスト14

1
以下を参照してください(カスタムUI要素を使用しているビューで自動レイアウトをオフにします)
JuJoDi

1
2016年(XCode 7、iOS 9.2)でも発生しますが、明らかな害はありません。
ハッチマスターJ 2016

回答:


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 2013年

3
私も同じ問題を抱えています。これはシミュレータでも発生しますが、バグが発生したときにMacキーボードを使用してシミュレータに入力できず、画面上のキーボードを使用する必要があることに気付きました。私のアプリではカスタムビューを使用していないため、CGコンテキストを手動で作成したり使用したりすることはありません。

1
そのおかげで、私は自分のアプリに問題があると思いました!しかし、あなたは完全に正しいです。私にとってもこのエラーの原因となったのは、テキストフィールドをダブルクリックしたことです。
Ash

201

これらのログの原因となっているコードに興味がある場合は、シンボリックブレークポイントを追加できますCGPostError


2
CGPostErrorについてのヒントをありがとう。ブレークポイントを設定しましたが、この問題を引き起こすために何もしていないようです。私の場合、それはメインスレッドで発生していますが、私のコードでは発生していません。
ポールヘラー

10
これは、この特定のケースでは解決策ではありませんが、プログラマー自身のコードのスコープ内にあるときに、どこに障害があるかを強調するためです。
アッシュ、

27
これは素晴らしい提案です。シンボリックブレークポイントやXcodeにそれらを追加する方法に慣れていない人のために、これについてのAppleのドキュメントがあります。developer.apple.com/library/ios/recipes/...
トニー・アダムス

これは私を助けました。私の場合、OS XアプリのビューにNSGradientを追加することが強調されました。
アーロンベグ2014年

1
あるビューのフレームを設定する前に描いていたようですが、よろしくお願いします!:)
Rick van der Linde

42

これらの種類のエラーは、歴史的には、andのdrawRectような呼び出し内または間に確立されたコンテキスト内にないときにCore Graphics関数を呼び出した結果(またはコンテキストを開始および終了する他のUIKit関数)です。UIGraphicsBeginImageContextUIGraphicsEndImageContext

ただし、bilobatumは正しいのですが、この特定のエラーシーケンスは、彼が回答で参照したiOS 7のバグの結果である可能性があります。iOS6ターゲットでこれらのエラーが表示されない場合、またはこのプライベートフレームワークを簡単にスキャンした後、疑わしいCore Graphics呼び出しが見つからない場合は、iOS 7のバグである可能性があります。良いキャッチ、bilobatum!


私はdrawRectを呼び出すプライベートフレームワークでビューを持っています。上記のメソッドを直接呼び出しているわけではありませんが、私の唯一の前提は、そのクラスのコードが何らかの形で関連しているということです。それでも、先ほど触れたように、以前のiOSではすべてがスムーズに実行されます。
Ælex

完成させるために(これがGoogleの一番上の結果です)、OSX 10.11.3では暗号エラーは変更されていません-Robが言うように、drawRectまたは別のコンテキストの外部に描画関数を持っていることによって引き起こされます-関連する機能。
green_knight 2016年

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

size.widthまたはsize.heightが0でないことを確認します。

CGPostErrorにシンボルブレークポイントを追加して確認できます


だから…CGPostErrorにシンボリックブレークポイントを追加すると、そのポイントでサイズをどのように確認できますか?
Cris

コマンドコールスタックは、「デバッグナビゲーションの表示」でcommand + 6で表示できます。次にツリーをクリックすると、関数に戻って変数を表示できます。
lbsweek 2014年

はい、imagviewを円形にするためにimageviewを渡していましたが、サイズがゼロであることがわかりました。2日後にようやく解決しました:D。
JiteshW 2015

19

シンプルなUITextField(コンソールにキーボードが表示されず、さまざまな無効なコンテキストエラーメッセージが表示される)でこの問題が発生しました。私はSOの別の問題を探すことで回避策を見つけます: CFBundle CertUIFramework.axbundleの実行可能ファイルが見つかりません

ただやる:

iOS Simulator> Reset Content and Settings ...をクリックして、再度実行します。

問題はもうないはずです


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

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

カスタム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

私の場合、キャップインセットを使用して再生可能な画像を作成するときにこの警告が表示されました。問題は、「キャップされていない」領域に少なくとも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つのポイントを残す必要があります
リベト

1

以下のコードを使用して、コンテキストからUIImageを作成していました:

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

    CGContextSetFillColorWithColor(context、color.CGColor);
    CGContextFillRect(context、(CGRect){。size = size});

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

したがって、エラーが発生していました。

そこで、派生データのコンテンツを削除し、XCodeを再起動しました。そしてそれはうまくいった。


それでは解決策は何ですか?
オタク2014

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

世界は沈黙した


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

    }
}

私はこれをiphone 4s、5、5sのiOS 7.0.3のシミュレータでテストしましたが、警告は表示されなくなりました。私はまた、iphone 6および6 plusのiOS 8のシミュレーターでこれをテストしましたが、iOS 8が影響を受けるとは思いません。

この回避策を発見する前に2日間の不満を経験したので、私の回答が同じ問題を抱えている皆さんに役立つことを願っています。


0

UIBezierPathを使用していてストロークや塗りつぶしの色を設定しているときにエラーが発生する場合は、設定した色コードを他の場所ではなくdrawRect関数に配置します。


0

これはハッキーですが、私にとってはうまくいきました。

私は、セットアップUIImageViewUITableViewCellのはinit、それを大きさと制約を与えます。

次に、私のView Controllerで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.