konteks yang tidak valid 0x0 di iOS 7.0 dan degradasi sistem


218

Saya telah membaca banyak hasil pencarian yang dapat saya temukan pada masalah yang ditakuti ini, sayangnya, masing-masing tampaknya berfokus pada pemanggilan fungsi tertentu.

Masalah saya adalah bahwa saya mendapatkan kesalahan yang sama dari beberapa fungsi, yang saya duga sedang dipanggil kembali dari fungsi yang saya gunakan.

Lebih buruk lagi, kode aktual berada dalam kerangka kerja pribadi khusus yang sedang diimpor di proyek lain, dan karenanya, debugging tidak sesederhana itu?

Adakah yang bisa mengarahkan saya ke arah yang benar? Saya merasa saya menyebut metode tertentu salah atau dengan konteks yang buruk, tetapi keluaran dari xcode tidak terlalu membantu pada saat ini.

: CGContextSetFillColorWithColor: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini adalah rasa hormat: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

: CGContextSetStrokeColorWithColor: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini bersifat sopan: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

CGContextSaveGState: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini adalah rasa hormat: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

: CGContextSetFlatness: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini adalah rasa hormat: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

: CGContextAddPath: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini bersifat sopan: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

: CGContextDrawPath: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini bersifat sopan: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

: CGContextRestoreGState: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini adalah rasa hormat: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

: CGContextGetBlendMode: konteks tidak valid 0x0. Ini adalah kesalahan serius. Aplikasi ini, atau perpustakaan yang digunakannya, menggunakan konteks yang tidak valid dan dengan demikian berkontribusi terhadap degradasi keseluruhan stabilitas dan keandalan sistem. Pemberitahuan ini adalah rasa hormat: tolong perbaiki masalah ini. Ini akan menjadi kesalahan fatal dalam pembaruan yang akan datang.

Kesalahan itu dapat terjadi ketika tampilan kustom disajikan, atau salah satu kelas yang diwarisi. Pada titik mana mereka muncul berkali-kali, hingga keyboard tidak memberikan input apa pun. Acara sentuh masih terdaftar, tetapi sistem melambat, dan akhirnya dapat menyebabkan kesalahan objek yang tidak terisi.

EDIT # 1: Saya memiliki akses ke framework yang sedang diimpor, tapi saya tidak melihat sesuatu yang aneh di kelas yang menyebabkan masalah.

EDIT # 2: Saya baru saja menerima email bahwa iOS 7.1 telah dirilis untuk pengembang. Saya ingin tahu apakah ini hilang, atau menjadi lebih buruk, atau dapat diselesaikan.


8
Kami mendapatkan kesalahan yang sama di aplikasi kami - dari kotak teks standar pada formulir. Jika Anda mengetuk kotak teks beberapa kali saat keyboard ditampilkan, Anda akan mendapatkan kesalahan ini muncul.

Sama disini. Terkadang ratusan log ini, terkadang nol. Saya pikir itu karena saya mengungguli drawRect: tetapi sepertinya ada sesuatu yang lain. Mengabaikannya untuk saat ini.
Krumelur

2
Saya baru saja menyelesaikan tutorial pertama tentang developer.apple.com (menyalin kode yang disarankan oleh Apple) dan saya mendapatkan kesalahan yang sama. Mungkin jika programmer lebih berpengalaman melihat tutorial itu mereka dapat melacak penyebab masalah ini.
Antonio Sesto

1
Lihat di bawah (matikan autolayout di tampilan tempat Anda menggunakan elemen UI khusus)
JuJoDi

1
Masih terjadi pada tahun 2016 (XCode 7, iOS 9.2), masih tidak ada kerugian yang terlihat.
Hatchmaster J

Jawaban:


162

Orang lain akan meminta Anda untuk memposting kode di mana Anda mengakses konteks grafis inti, tetapi saya ragu itulah masalahnya. Pesan kesalahan 0x0 konteks yang tidak valid ini umum dan mudah direproduksi di iOS 7. Bahkan, saya dapat mereproduksi kesalahan menggunakan storyboard dengan kode nol. Saya menyeret UITextField ke kanvas di IB, menjalankan aplikasi, dan ketuk dua kali di dalam bidang teks.

Dalam banyak situasi, sulit bagi saya untuk menganggap serius pesan kesalahan 0x0 konteks yang tidak benar. Saya tidak tahu apakah situasi Anda memerlukan perhatian yang lebih besar (saya setuju dengan Rob Napier bahwa ada baiknya diselidiki, terutama jika Anda secara eksplisit menggunakan konteks grafis).

Dalam proyek saya sendiri, saya berharap bahwa banyak dari kesalahan ini menghilang secara ajaib suatu hari (tetapi hari itu tidak datang dengan 7.0.3).

Pembaruan: Setelah menginstal Xcode 5.1 dan menargetkan iOS 7.1, saya tidak bisa lagi mereproduksi kesalahan dengan mengetuk dua kali di dalam bidang teks kosong.


10
Anda sepenuhnya benar tentang bug iOS 7 UITextField ini. Pastikan untuk membuka radar untuk itu, meskipun (bugreport.apple.com) Tapi jangan terlalu cepat untuk menganggap itu masalahnya di sini. Karena ini adalah tampilan khusus, ada baiknya terlebih dahulu menyelidiki poin @ Rob.
Rob Napier

2
Itu terjadi pada saya .. Saya menjatuhkan uitextfield pada IB, mendapatkan kesalahan itu dan keyboard tidak muncul .. apakah ada beberapa solusi ?? Terima kasih
Frade

@Frade Bagi saya, keyboard muncul dan aplikasi berjalan normal meskipun ada pesan galat. Jadi, Anda mungkin memiliki masalah tambahan.
bilobatum

3
Saya juga punya masalah yang sama. Ini juga hanya terjadi di simulator, tetapi saya perhatikan bahwa, ketika saya mendapatkan bug, saya tidak dapat menggunakan keyboard Mac untuk mengetikkan simulator dan saya harus menggunakan keyboard layar, yang sangat membuat frustrasi. Di aplikasi saya, saya tidak menggunakan tampilan khusus, jadi saya tidak pernah secara manual membuat atau menggunakan konteks CG.

1
Syukurlah untuk itu, saya pikir itu adalah aplikasi saya yang salah! Anda sepenuhnya benar; mengklik dua kali di bidang teks yang menyebabkan kesalahan ini juga untuk saya.
Ash

201

Jika Anda penasaran kode apa yang menyebabkan log ini, Anda dapat menambahkan breakpoint simbolis pada CGPostError.


2
Terima kasih atas tipnya tentang CGPostError. Saya meletakkan breakpoint di atasnya dan sepertinya saya tidak melakukan apa-apa untuk menyebabkan masalah ini. Dalam kasus saya ini terjadi pada utas utama tetapi tidak dalam kode saya.
Paul Heller

10
Votin 'up ini karena, meskipun bukan solusi dalam kasus khusus ini, itu AKAN sering menyoroti di mana letak kesalahan, ketika itu berada dalam lingkup kode programmer sendiri.
Ash

27
Ini saran yang bagus. Bagi mereka yang tidak terbiasa dengan breakpoints simbolik atau cara menambahkannya dalam Xcode, berikut adalah dokumen Apple tentang hal itu. developer.apple.com/library/ios/recipes/…
Tony Adams

Ini membantu saya. Dalam kasus saya ini menyoroti saya menambahkan NSGradient ke tampilan pada aplikasi OS X saya.
Aaron Vegh

1
Sepertinya saya sedang menggambar sebelum mengatur bingkai untuk tampilan tertentu, terima kasih! :)
Rick van der Linde

42

Jenis kesalahan ini secara historis merupakan hasil dari memanggil fungsi-fungsi Core Graphics ketika tidak berada dalam konteks yang dibuat di dalam drawRectatau di antara panggilan-panggilan seperti UIGraphicsBeginImageContextdan UIGraphicsEndImageContext(atau fungsi-fungsi UIKit lainnya seperti yang memulai dan mengakhiri suatu konteks).

Meskipun demikian, bilobatum benar bahwa urutan kesalahan tertentu ini dapat disebabkan oleh bug iOS 7 yang dirujuknya dalam jawabannya. Jika tidak melihat kesalahan ini dalam target iOS6 Anda, atau jika setelah pemindaian cepat kerangka kerja pribadi ini Anda tidak menemukan tersangka panggilan Core Graphics, itu mungkin saja bug iOS 7 ini. Tangkapan bagus, bilobatum!


Saya memiliki pandangan dalam kerangka kerja pribadi yang memanggil drawRect. Sedangkan saya tidak secara langsung memanggil salah satu metode yang disebutkan, satu-satunya asumsi saya adalah bahwa kode di kelas itu entah bagaimana terkait. Namun, seperti yang saya sebutkan, semuanya berjalan dengan lancar di bawah iOS sebelumnya.
Ælex

Demi penyelesaian (ini adalah hasil google teratas), saya ingin mencatat bahwa kesalahan samar tidak berubah pada OSX 10.11.3 - dan menyebabkan, seperti kata Rob, dengan memiliki fungsi menggambar di luar drawRect atau konteks lain- fungsi terkait.
green_knight

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

pastikan size.width atau size.height bukan 0,

Anda dapat menambahkan simbol breakpoint ke CGPostError untuk memeriksa


jadi ... menambahkan breakpoint simbolis di CGPostError, bagaimana kita bisa melihat ukuran pada titik itu?
Cris

Anda dapat melihat tumpukan panggilan fungsi di "show the debug navigation" dengan perintah + 6. kemudian Anda mengklik pada pohon, maka Anda dapat kembali ke fungsi Anda untuk melihat variabel.
lbsweek

Ya, saya melewati imageview untuk membuat imagview itu melingkar, Tapi, Ternyata ukurannya nol. Akhirnya diselesaikan setelah 2 hari: D.
JiteshW


16

Dalam kasus saya, saya mengalami kesalahan dalam kode ini:

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

setelah beberapa pemikiran dan tes saya mendeteksi masalah - itu panggilan ini:

[path fill];

ketika saya mendeteksi - dalam kode saya panggilan ini tidak perlu, karena mengisi akan dilakukan dengan cara lain - jadi saya cukup menghapusnya.


5

Saya memiliki masalah yang sama dan saya lupa mengimpor QuartzCore / QuartzCore.h, ini menyelesaikan masalah saya dengan kesalahan ini.

    #import <QuartzCore/QuartzCore.h>

5

Jawaban Langsung: Masalahnya adalah karena Anda telah menggunakan elemen grafis Inti seperti CGContext dll- (void)drawRect:(CGRect)rect metode ini.

Sekarang pindahkan kode Anda ke metode ini. Dan itu akan berhenti memberi Anda peringatan / Kesalahan.


4

Saya mendapatkan kesalahan ini karena saya menggunakan objek UIColor sebagai atribut dalam kamus NSAttributedString yang sedang digunakan dalam objek CATextLayer. Saya mengubah kamus untuk memegang CGColorRef dan kesalahan hilang.

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

2

Saya memiliki kasus di mana konteksnya kembali dari UIGraphicsGetCurrentContext()ini NULL, dan jika Anda mencoba menggunakannya untuk apa pun ini muncul pesan. Adalah tanggung jawab pandangan untuk mendorong konteks menggunakan UIGraphicsPushContextsebelum menelepon drawRect:, jika Anda menelepon drawRect:langsung alih-alih [view setNeedsDisplay]mengambil risiko konteksnya belum ditetapkan. Firasat saya adalah bahwa sebelum iOS 7 konteksnya didorong untuk tampilan aktif init, dan sekarang pada iOS 7 konteksnya tidak didorong sampai pertama kali drawRect:akan dipanggil. Saya menduga beberapa kode UIKit memanggildrawRect: langsung dan inilah mengapa ada masalah dengan beberapa kode bahkan ketika tidak ada gambar kustom yang dilakukan.

Solusi (jika melakukan gambar kustom):

  1. Jangan menelepon drawRect:langsung, menggunakan [view setNeedsDisplay]atau jika Anda perlu menggunakan menggambar segera[view.layer draw]
  2. Dalam drawRect:konteksnya Anda dapatkan tetapi jangan menggunakannya di luar isi pernyataan if iniif (context) {<do drawing here>}

2

Menonaktifkan autolayout dalam tampilan yang terpengaruh menyebabkan kesalahan ini hilang dalam beberapa kasus di mana Anda menempatkan dan memindahkan elemen UI (terutama yang kustom yang diambil secara terprogram) di dalam tampilan. Saya menggunakan JVFloatLabeledTextField ketika saya menemukan gejala ini.


2

Dalam beberapa kasus, Anda mungkin perlu memasukkan garis #import <QuartzCore/QuartzCore.h>.


2

Saya mendapatkan kesalahan ini dalam metode drawInContext (..) dari implementasi CALayer kustom saya. UIBezierPath mencoba menggunakan UIGraphicsGetCurrentContext () yang nihil secara default di lapisan kustom. The dokumentasi online menjelaskan ini sangat jelas -

Namun, jika Anda tidak menggunakan objek UIView untuk menggambar, Anda harus mendorong konteks yang valid ke tumpukan secara manual menggunakan fungsi UIGraphicsPushContext.

Inilah kode yang akhirnya bekerja dengan komentar saya sebaris (kode Swift, tetapi solusinya sama terlepas)

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

Dalam kasus saya, saya mengalami peringatan ini saat membuat gambar yang dapat direset dengan cap insets. Masalahnya adalah bahwa saya tidak meninggalkan setidaknya 1 piksel di area "tidak terbuka".

    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
Punya masalah yang sama persis. Rupanya Anda harus meninggalkan setidaknya 1 titik area di mana gambar dapat meregang
ribeto

1

Saya membuat UIImage dari konteks menggunakan kode di bawah ini:

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

    CGContextSetFillColorWithColor (konteks, color.CGColor);
    CGContextFillRect (konteks, (CGRect) {. Size = size});

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

Jadi saya mendapatkan kesalahan.

Jadi saya menghapus konten Data yang Diperoleh, me-restart XCode saya. Dan itu berhasil.


Lalu apa solusinya?
Geek

1
@ Geek, solusi terbaru. Hapus konten DerivedData dan mulai ulang.
Temui

1

Saya memiliki masalah yang sama. Dalam proyek saya, saya telah mencoba membuat textField dan menambahkannya ke file pdf saya. Kode Lama:

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

Setelah menyelesaikan masalah ini, kode berubah:

old:[[UIColor blackColor] setFill]; 

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

Saya menemukan solusi di UIColor SetFill tidak berfungsi . Dan terima kasih penolongnya.


1

Saya mendapat kesalahan dengan kode

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;

dan setelah menghapus kode

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

Dunia menjadi sunyi


0

Bagi saya, jawabannya adalah bahwa saya tidak perlu merilis konteks grafis di drawRect:. Melemparkan breakpoint simbolis pada CGPostError mengarahkan saya ke pelakunya.


0

Mendapat kesalahan ini seperti yang saya atur

textfield.delegate = self

Tanpa menerapkan salah satu rutin delegasi. Menghapus garis itu memecahkan masalah bagi saya


0

Saya memiliki masalah ini di UITextField ketika saya memegang sentuhan pada bidang kosong dengan teks placeholder saja. Saya menggunakan solusi berikut ini untuk menghilangkan bidang kosong:

-(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

Bagi saya, saya mendapatkan kesalahan ini karena saya melepaskan CGContextRef seperti yang ditunjukkan di bawah ini:

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

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

//    CGContextRelease(context);
}

Menghapus rilis memecahkan masalah


0

Saya mendapatkannya ketika saya salah mengetik nama gambar dalam metode activityImage di subkelas UIActivity

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

Mengetik gambar yang tepat memecahkannya untuk saya.



0

Seperti orang lain yang berkomentar di sini, saya mendapatkan peringatan ini ketika saya melakukan salah satu dari yang berikut:

Pada bidang teks kosong: Ketuk dua kali, sentuh dan tahan, ketuk tunggal yang panjang.

Ini sepertinya hanya mempengaruhi iOS 7.0.3

Saya menemukan pekerjaan di sekitar, peringatan tidak akan dipicu jika papan tulis Anda bukan NULL.

Jadi saya melakukan hal berikut di textFieldDidBeginEditing:

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

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

        pasteboard.string = @" ";

    }
}

Saya menguji ini dalam simulator untuk iOS 7.0.3 pada iphone 4s, 5 dan 5s dan tidak lagi menerima peringatan. Saya juga menguji ini dalam simulator untuk iOS 8 pada iphone 6 dan 6 plus tetapi saya tidak percaya iOS 8 terpengaruh.

Pergi melalui dua hari frustrasi sebelum menemukan pekerjaan ini, jadi saya sangat berharap jawaban saya membantu Anda yang memiliki masalah yang sama.


0

Jika kesalahan terjadi ketika Anda menggunakan UIBezierPath dan mengatur warna untuk stroke atau mengisi, masukkan kode warna yang ditetapkan dalam fungsi drawRect daripada tempat lain.


0

Ini hacky tetapi berhasil untuk saya.

Saya mengatur UIImageViewdi UITableViewCell's init, berikan ukuran dan kendala.

Kemudian pada pengontrol tampilan saya, cellForRowAtIndexPathsaya melakukan ini:

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

Dan itu menghindari kesalahan, maka di bawah itu dalam fungsi saya mengatur gambar yang sebenarnya untuk itu UIImageView. Kode di atas adalah standar yang baik

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.