web-dev-qa-db-ja.com

iOS 7.0での無効なコンテキスト0x0とシステムの性能低下

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

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

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

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

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

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

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

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

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

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

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

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

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

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

EDIT#2 : iOS 7.1が開発者向けにリリースされたというメールを受け取りました。これがなくなるのか、それとも悪化するのか、それとも解決できるのか、私は興味があります。

218
Ælex

他の人はあなたがコアグラフィックスコンテキストにアクセスするところにコードを投稿するようにあなたに頼むでしょう、しかし私はそれが問題であると思いません。これらの無効なコンテキスト0x0エラーメッセージは、iOS 7で一般的で再現しやすいものです。実際、ゼロコードのストーリーボードを使用してエラーを再現できます。 UITextFieldをIBのキャンバスにドラッグしてアプリを実行し、テキストフィールド内をダブルタップします。

多くの場合、invalid context 0x0エラーメッセージを真剣に考えるのは難しいです。あなたの状況がより大きな懸念を正当化するものであるかどうかはわかりません(特にグラフィックコンテキストを明示的に使用している場合は、調査する価値があることにRob Napierに同意します)。

私自身のプロジェクトでは、これらのエラーの多くがいつの日か魔法のように消えることを願っています(しかしその日は7.0.3では起こりませんでした)。

更新: Xcode 5.1をインストールしてiOS 7.1をターゲットにした後、空のテキストフィールド内をダブルタップしてもエラーを再現できなくなりました。

162
bilobatum

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

200
Art Gillespie

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

とは言っても、bilobatumは、この特定のエラーのシーケンスが、彼の答えで言及しているiOS 7のバグの結果である可能性があることは正しいと言っています。あなたのiOS6ターゲットでこれらのエラーが見られない場合、またはこのプライベートフレームワークのクイックスキャンの後に疑わしいCore Graphics呼び出しが見つからない場合、それはちょうどこのiOS 7のバグかもしれません。いいキャッチ、双葉!

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

size.widthまたはsize.heightが0ではないことを確認してください。

チェックするためにCGPostErrorにシンボルブレークポイントを追加することができます。

26
lbsweek

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

ただしてください:

iOSシミュレータ>コンテンツと設定のリセット...をクリックして、もう一度実行してください。

問題はもうないはずです

19
Kevin Delord

私の場合、私はこのコードにこれらのエラーがあります。

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

私が検出したとき - 私のコードではこの呼び出しは必要ではありません、なぜなら充填は他の方法で行われるからです - だから私はそれを単に削除します。

16
Denis Kozhukhov

素直な答え:問題は、CGContextなどのCoreグラフィックス要素をこのメソッドの- (void)drawRect:(CGRect)rect以外に使用したためです。

それでは、親切にこのメソッドにコードを移動してください。そしてそれはあなたに警告/エラーを与えるのをやめます。

5
user3693546

私はこれと同じ問題があり、私はQuartzCore/QuartzCore.hをインポートするのを忘れました。これはこれらのエラーで私の問題を解決しました。

    #import <QuartzCore/QuartzCore.h>
5
David Roop

CATextLayerオブジェクトで使用されていたNSAttributedString辞書の属性としてUIColorオブジェクトを使用していたため、このエラーが発生しました。私はCGColorRefを保持するように辞書を変更し、エラーは消えました。

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

私はUIGraphicsGetCurrentContext()から返されたコンテキストがNULLであるケースを経験しました、そして、あなたがそれを何にでも使用しようとするならば、このメッセージは現れます。 drawRect:の代わりに直接drawRect:を呼び出す場合は、コンテキストがまだ設定されていないリスクがあるので、[view setNeedsDisplay]を呼び出す前にUIGraphicsPushContextを使用してコンテキストをプッシュするのはビューの責任です。私の願いは、iOS 7より前のコンテキストではinit上のビューにコンテキストがプッシュされていましたが、今ではiOS 7ではdrawRect:が呼び出される直前までコンテキストはプッシュされません。私はいくつかのUIKitコードがdrawRect:を直接呼び出しているのではないかと思われるので、カスタム描画が行われていなくてもいくつかのコードに問題があるのはこのためです。

解決策(カスタム描画を行う場合):

  1. drawRect:を直接呼び出さないでください、[view setNeedsDisplay]を使用するか、または即時描画が必要な場合は[view.layer draw]を使用してください。
  2. drawRect:でコンテキストを取得しますが、このif本体の外側では使用しないでくださいif (context) {<do drawing here>}
2
jamone

私の場合は、キャップインセットを使用してサイズ変更可能な画像を作成するときにこの警告が表示されていました。問題は、「キャップなし」の領域に少なくとも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];
2
balkoth

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

場合によっては、#import <QuartzCore/QuartzCore.h>という行を含める必要があります。

2
Nagarjun

影響を受けるビューで自動レイアウトをオフにすると、ビュー内にUI要素(特にプログラムで描画されるカスタム要素)を配置したり移動したりする場合に、このエラーがなくなることがあります。この症状を発見したときは、JVFloatLabeledTextFieldを使用していました。

2
JuJoDi

私はコードでエラーを得ました

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

世界は沈黙した

1
wossoneri

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

 UIGraphicsBeginImageContext(size); 
 CGContextRef context = UIGraphicsGetCurrentContext(); 
 
 CGContextSetFillColorWithColor(context、color.CGColor); 
 CGContextFillRect(context、 (CGRect){。size = size}); 
 
 UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
 UIGraphicsEndImageContext(); 

したがって、私はエラーを受けていました。

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

1
Meet

私は同じ問題を抱えています。私のプロジェクトでは、私は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]);

解決策は IColor SetFillが機能しない で見つかりました。そして、助ってくれてありがとう。

1
Kate

シミュレータからアプリをアンインストールして、もう一度実行してください

0
Nagarjun

私には、以下に示すように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
Kyle Redfearn

ここでコメントした他の人たちと同じように、私は以下のいずれかをしたときにこの警告を受けていました。

空白のテキストフィールド:ダブルタップ、長押し、シングルタップ。

これはiOS 7.0.3にのみ影響するようです

私は回避策を発見しました、あなたのペーストボードがNULLでないならば、警告は引き起こされないでしょう。

だから私はtextFieldDidBeginEditingで以下をしました:

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

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

        pasteboard.string = @" ";

    }
}

私はiphone 4秒、5秒、5秒のiOS 7.0.3用のシミュレータでこれをテストしましたが、もはや警告を受けません。私はまたiphone 6と6 plusの上でiOS 8のためのシミュレータでこれをテストしました、しかし私はiOS 8が影響を受けるとは思わない。

この問題を発見する前に2日間のフラストレーションを経験したので、私の答えが同じ問題を抱えている皆さんの助けになることを願っています。

0
RS-232

UIActivityサブクラスのactivityImageメソッドでイメージ名を誤って入力したときに取得しました

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

正しい画像を入力すると解決しました。

0
Saleh Albuga

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

0
Chuyang

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

UIImageViewUITableViewCellinitに設定し、サイズと制約を与えます。

それから私の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のために実際のイメージを設定しました。上記のコードは良いデフォルトです

0
Zack Shapiro

私にとっては、答えはdrawRect:のグラフィックスコンテキストを不必要に解放していたということでした。 CGPostErrorにシンボリックブレイクポイントを投げると、私はその原因を指摘してくれました。

0
Taylor Halliday

私が設定したようにこのエラーを得た

textfield.delegate = self

デリゲートルーチンを実装せずに。その行を削除すると問題が解決しました

0
Daniel Åkesson

プレースホルダテキストだけで空白のフィールドをタッチしたときに、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
Peter B. Kramer