1

これが無効なコンテキストを報告するのはなぜですか?

<Error>: CGContextSaveGState: invalid context 0x0. This is a serious error.
This application, or a library it uses, is using an invalid context and is
thereby contributing to an overall degradation of system stability and
reliability. This notice is a courtesy: please fix this problem. It will
become a fatal error in an upcoming update.

これは、drawInRectUIImage のカテゴリ メソッドでの呼び出しで発生します。

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    CGSize oldSize = self.size;

    CGRect rect = (CGRect){
        {
            floorf((newSize.width-oldSize.width)/2),
            floorf((newSize.height-oldSize.height)/2)
        },
        oldSize
    };
    [self drawInRect:rect];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

私の理解では、UIGraphicsBeginImageContextWithOptionsそれが私が引き込むコンテキストを確立するということです。そして、これは通常、ケアのようですが、代わりにこの失敗をすることはめったにありません。

これは、Xcode 5.1.1 に含まれる iOS 7 シミュレーターを使用しています。

4

1 に答える 1

4

(最初は、これはHow can I fix CGContextRestoreGState: invalid context 0x0のだましだと思っていました。そうではありません。メッセージは異なり、これは簡単に修正できます。)

このエラーが発生しnewSizeている場合、0 (または負)のheightand/orがあります。width

UIGraphicsBeginImageContextWithOptionsこの場合は失敗しますが、エラーを返すような形にはなっていません。(戻り値も結果もありません。) したがって、作成できなかったコンテキストで描画しようとするとすぐに、代わりにこのエラーが発生します。

これをテストするには、次の行を追加します。

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    NSParameterAssert(newSize.width > 0);
    NSParameterAssert(newSize.height > 0);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);

試してみてください。私の推測では、数分間のテストでクラッシュします。

これが実際に起こっていることである場合は、代わりに次のように恒久的な修正を加えることをお勧めします。

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    if ((newSize.width <= 0) || (newSize.height <= 0)) {
        return nil;
    }
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);

アイデアは、画像をゼロまたは負のサイズにパディングできないため、単に return nil.

于 2014-07-21T23:03:59.120 に答える