iOS 7.0 altında geçersiz bağlam 0x0 ve sistem bozulması


218

Ne yazık ki, bu korkunç sorun üzerinde bulabildiğim kadar çok arama sonucu okudum, her biri belirli bir işlev çağrısı odaklanmak gibi görünüyor.

Benim sorunum, aynı işlevi kullandığım işlevlerden geri çağrılıyor sanırım birden çok işlevden aynı hatayı alıyorum.

Daha da kötüsü, gerçek kod başka bir projede içe aktarılan özel bir özel çerçeve içinde ve bu nedenle hata ayıklama o kadar kolay değil mi?

Birisi beni doğru yöne yönlendirebilir mi? Bazı yöntemleri yanlış veya kötü bağlam ile çağırıyorum bir duygu var, ama xcode çıktı bu noktada çok yararlı değil.

: CGContextSetFillColorWithColor: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

: CGContextSetStrokeColorWithColor: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

CGContextSaveGState: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

: CGContextSetFlatness: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

: CGContextAddPath: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

: CGContextDrawPath: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

: CGContextRestoreGState: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

: CGContextGetBlendMode: geçersiz bağlam 0x0. Bu ciddi bir hatadır. Bu uygulama veya kullandığı bir kitaplık geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezakettir: lütfen bu sorunu giderin. Önümüzdeki bir güncellemede ölümcül bir hata haline gelecektir.

Bu hatalar, özel bir görünüm sunulduğunda veya devralınan sınıflarından birinde oluşabilir. Bu noktada, klavye herhangi bir giriş sağlamayana kadar birden çok kez ortaya çıkarlar. Dokunma olayları hala kayıtlı, ancak sistem yavaşlıyor ve sonuçta ayrılmamış nesne hatalarına neden olabilir.

EDIT # 1: İçe aktarılan çerçeveye erişimim var, ancak soruna neden olan sınıflarda garip bir şey görmüyorum.

EDIT # 2: iOS 7.1'in geliştiriciler için piyasaya sürüldüğü bir e-posta aldım. Bunun gidip gitmediğini, daha da kötüleştiğini veya çözülebileceğini merak ediyorum.


8
Aynı hatayı uygulamamızda alıyoruz - formdaki standart metin kutusundan. Klavye gösterilirken metin kutusuna birkaç kez dokunursanız, bu hatayı görebilirsiniz.

Burada aynı. Bazen bu günlüklerden yüzlerce, bazen sıfır. Bunun drawRect'i geçersiz kıldığım için olduğunu düşündüm: ama başka bir şey gibi görünüyor. Şimdilik yok sayılıyor.
Krumelur

2
Sadece developer.apple.com (Apple tarafından önerilen kodu kopyalayarak) ilk öğretici bitirdim ve aynı hatayı alıyorum. Daha deneyimli programcılar bu eğiticiye bakarsa, bu sorunun nedenini izleyebilirler.
Antonio Sesto

1
Aşağıya bakın (özel kullanıcı arayüzü öğelerini kullandığınız görünümlerde
otomatik yerleşimi kapatın

1
Hala 2016'da (XCode 7, iOS 9.2) gerçekleşiyor, hala belirgin bir hasar yok.
Hatchmaster J

Yanıtlar:


162

Diğerleri sizden kodu temel bir grafik bağlamına eriştiğiniz yerde yayınlamanızı isteyecektir, ancak sorunun bundan şüpheliyim. Bu geçersiz bağlam 0x0 hata mesajları yaygındır ve iOS 7'de çoğaltılması kolaydır. Aslında, sıfır koduyla film şeridini kullanarak hatayı yeniden oluşturabilirim. Bir UITextField öğesini IB'deki tuval üzerine sürükledim, uygulamayı çalıştırdım ve metin alanının içine iki kez hafifçe vurdum.

Birçok durumda, geçersiz 0x0 hata mesajlarını ciddiye almak benim için zor. Durumunuzun daha fazla endişe gerektirip gerektirmediğini bilmiyorum (Rob Napier ile araştırmaya değer olduğunu kabul ediyorum, özellikle de açıkça bir grafik bağlamı kullanıyorsanız).

Kendi projelerimde, bu hataların çoğunun bir gün sihirli bir şekilde yok olmasını umuyorum (ancak o gün 7.0.3 ile gelmedi).

Güncelleme: Xcode 5.1'i yükledikten ve iOS 7.1'i hedefledikten sonra, artık boş bir metin alanına çift dokunarak hatayı yeniden oluşturamıyorum.


10
Bu iOS 7 UITextField hatasıyla ilgili tamamen haklısınız. Yine de bunun için bir radar açtığınızdan emin olun (bugreport.apple.com) Ancak burada sorun olduğunu varsaymak için çok hızlı olmayın. Özel bir görünüm olduğu için, ilk önce @ Rob'un puanlarını araştırmaya değer.
Rob Napier

2
Bu bana oluyor .. IB üzerine bir uitextfield bırakıyorum, bu hatayı alıyorum ve klavye görünmüyor .. bazı çözüm var mı ?? Teşekkürler
Frade

@ Ticaret Benim için, klavye belirir ve uygulama sert hata mesajına rağmen normal çalışır. Böylece ek bir sorununuz olabilir.
bilobatum

3
Ben de aynı sorunu yaşıyorum. Ayrıca sadece simülatörde olur, ancak hatayı aldığımda, simülatörde yazmak için Mac klavyesini kullanamayacağımı ve çok sinir bozucu olan ekran klavyesini kullanmam gerektiğini fark ettim. Uygulamamda herhangi bir özel görünüm kullanmıyorum, bu yüzden asla bir CG bağlamı oluşturmuyorum veya kullanmıyorum.

1
Bunun için çok şükür, hatalı benim app olduğunu düşündüm! Tamamen haklısın; benim için de bu hataya neden olan bir metin alanına çift tıklamaktı.
Ash

201

Bu günlüklere hangi kodun neden olduğunu merak ediyorsanız, üzerine sembolik bir kesme noktası ekleyebilirsinizCGPostError .


2
CGPostError hakkındaki ipucu için teşekkürler. Üzerine bir kesme noktası koydum ve bu soruna neden olacak hiçbir şey yapmıyorum gibi görünüyor. Benim durumumda ana iş parçacığında oluyor ama benim kodumda değil.
Paul Heller

10
Bunu oylayın, çünkü bu özel durumda çözüm olmasa da, genellikle programcının kendi kodu kapsamında olduğunda hatanın nerede olduğunu vurgulayacaktır.
Ash

27
Bu harika bir öneri. Sembolik kesme noktalarına veya bunları Xcode'a nasıl ekleyeceğine aşina olmayanlar için, Apple'ın bu konuyla ilgili dokümanı. developer.apple.com/library/ios/recipes/…
Tony Adams

Bu bana yardımcı oldu. Benim durumumda, OS X uygulamamdaki bir görünüme NSGradient eklememi vurguladı.
Aaron Vegh

1
Görünüşe göre belirli bir görünüm için bir çerçeve ayarlamadan önce çiziyordum, teşekkürler! :)
Rick van der Linde

42

Bu tür hatalar, tarihsel olarak, ve (veya bir bağlamı başlatan ve sona erdiren gibi UIKit işlevleri gibi) drawRectarasında veya içinde kurulan bir bağlam içinde olmadığında Temel Grafik fonksiyonlarını çağırmanın sonucudur .UIGraphicsBeginImageContextUIGraphicsEndImageContext

Bununla birlikte, bilobatumun bu belirli hata dizisinin cevabında referansta bulunduğu iOS 7 hatasının bir sonucu olabileceğini doğru söyleyerek. İOS6 hedeflerinizde bu hataları görmüyorsanız veya bu özel çerçevenin hızlı bir taramasından sonra şüpheli Çekirdek Grafik aramaları bulamazsanız, bu sadece iOS 7 hatası olabilir. İyi yakaladın, bilobatum!


Özel çerçevede drawRect'i çağıran bir görüşüm var. Doğrudan belirtilen yöntemlerden herhangi birini çağırmıyorum, ancak benim tek varsayım bu sınıftaki kod bir şekilde ilişkili olmasıdır. Yine de, daha önce de belirttiğim gibi, her şey önceki iOS'larda sorunsuz çalışıyor.
Novlex

Tamamlama uğruna (bu en iyi google sonucudur), şifreli hatanın OSX 10.11.3'te değişmediğini ve Rob'un dediği gibi drawRect veya başka bir bağlamın dışında bir çizim işlevine sahip olduğunu belirtmek isterim. ilgili işlev.
green_knight

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

boyutundan emin olun. genişlik veya boyut. yükseklik 0 değil,

kontrol etmek için CGPostError öğesine sembol kesme noktası ekleyebilirsiniz


yani… CGPostError'a sembolik bir kesme noktası ekleyerek, kişi o noktada boyuta nasıl bakabilir?
Cris

fonksiyon çağrısı yığınını + 6 komutuyla "hata ayıklama navigasyonunu göster" bölümünde görüntüleyebilirsiniz. sonra ağaca tıklarsanız, değişkeni görmek için işlevinize geri dönebilirsiniz.
lbsweek

Evet, ben bu imagview dairesel yapmak için imageview geçiyordu, ama, onun boyutu sıfır bulundu. Sonunda 2 gün sonra çözüldü: D.
JiteshW


16

Benim durumumda bu kodda şu hataları var:

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

bazı düşünceler ve test sonra ben sorunu tespit - bu çağrı oldu:

[path fill];

tespit ettiğim gibi - kodumda bu çağrı gerekli değildir, çünkü doldurma başka bir şekilde yapılacaktır - bu yüzden sadece kaldırıyorum.


5

Ben de aynı sorunu vardı ve QuartzCore / QuartzCore.h ithal unuttum, Bu bu hataları ile benim sorun çözüldü.

    #import <QuartzCore/QuartzCore.h>

5

Düz Yanıt: Sorun, - (void)drawRect:(CGRect)rectbu yöntem dışında CGContext vb.Gibi Temel grafik öğelerini kullanmanızdır.

Şimdi lütfen kodunuzu bu yönteme taşıyın. Ve size uyarılar / Hatalar vermeyi bırakacaktır.


4

Bir CATextLayer nesnesinde kullanılan bir NSAttributedString sözlüğünde bir öznitelik olarak bir UIColor nesnesi kullanıyordum çünkü bu hatayı alıyordum. Bir CGColorRef tutmak için sözlüğü değiştirdim ve hata gitti.

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

2

Ben bağlam dönen vakalar oldu UIGraphicsGetCurrentContext()ise NULLbir şey için bu mesajı görüntülenir kullanmadan deneyin ve eğer. UIGraphicsPushContextArama yapmadan önce bir bağlamı zorlamak, görünümün sorumluluğunu almak yerine doğrudan drawRect:arama yaparsanız, bağlamın henüz ayarlanmadığını riske atarsınız. Benim önsezim, iOS 7'den önce bağlamın görüntülenmesi için itildi ve şimdi iOS 7'de, ilk kez çağrılacak olana kadar bağlamın itilmemesi . Bazı UIKit kodu doğrudan arıyor şüpheli ve bu yüzden hiçbir özel çizim yapılıyor olsa bile bazı kod ile ilgili sorunlar vardır.drawRect:[view setNeedsDisplay]initdrawRect:drawRect:

Çözümler (özel çizim yapıyorsanız):

  1. drawRect:Doğrudan arama , kullanma [view setNeedsDisplay]veya hemen çizim kullanımına ihtiyacınız varsa[view.layer draw]
  2. Gözlerinde farklı drawRect:bağlam olsun ama deyimi ise bu vücut dışında kullanmayınif (context) {<do drawing here>}

2

Etkilenen görünümde otomatik yerleşimi kapatmak, UI öğelerini (özellikle programlı olarak çizilen özel olanlar) bir görünüme yerleştirdiğiniz ve taşıdığınız bazı durumlarda bu hatanın ortadan kalkmasına neden olur. Bu belirtiyi keşfettiğimde JVFloatLabeledTextField kullanıyordum.


2

Bazı durumlarda satırı eklemeniz gerekebilir #import <QuartzCore/QuartzCore.h>.


2

Bu hatayı özel CALayer uygulamamın drawInContext (..) yönteminde aldım. UIBezierPath, özel bir katmanda varsayılan olarak sıfır olan UIGraphicsGetCurrentContext () yöntemini kullanmaya çalışır. Online belgeler çok açık bir şekilde açıklıyor -

Bununla birlikte, çiziminizi yapmak için bir UIView nesnesi kullanmıyorsanız, UIGraphicsPushContext işlevini kullanarak yığının üzerine geçerli bir bağlamı el ile itmeniz gerekir.

İşte sonunda satır içi yorumlarımla çalışan kod (Swift kodu, ancak çözüm ne olursa olsun aynıdır)

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

Benim durumumda, kapak ekleri olan resible bir görüntü oluştururken bu uyarıyı alıyordum. Sorun, "kapaksız" alanda en az 1 piksel bırakmadığıydı.

    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
Tamamen aynı sorun vardı. Görünüşe göre görüntünün uzayabileceği en az 1 nokta
bırakmanız gerekiyor

1

Aşağıdaki kodu kullanarak bağlamdan UIImage oluşturuyordum:

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

    CGContextSetFillColorWithColor (bağlam, renk.CGColor);
    CGContextFillRect (bağlam, (CGRect) {. Size = size});

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

Böylece hatayı alıyordum.

Böylece Türetilmiş Veri içeriğini kaldırdım, XCode'umu yeniden başlattım. Ve işe yaradı.


O zaman çözüm nedir?
Geek

1
@Geek, güncellenmiş çözüm. DerivedData içeriğini kaldırın ve yeniden başlatın.
Tanışma

1

Aynı problemim var. Projemde, bir textField oluşturmaya ve pdf dosyama eklemeye çalıştım. Eski Kod:

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

Bu sorunu çözdükten sonra kod değişti:

old:[[UIColor blackColor] setFill]; 

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

UIColor SetFill'deki çözümün işe yaramadığını gördüm . Ve yardımcıya teşekkürler.


1

Kod ile ilgili hatayı aldım

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;

ve kod kaldırıldıktan sonra

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

Dünya sessizleşti


0

Benim için cevap, gereksiz yere grafik bağlamını serbest bıraktığımdı drawRect:. CGPostError üzerine sembolik bir kırılma noktası atmak beni suçluya işaret etti.


0

Ayarladığım gibi bu hatayı aldım

textfield.delegate = self

Delege rutinlerini uygulamadan. Bu çizgiyi kaldırmak benim için sorunu çözdü


0

Ben sadece yer tutucu metin ile boş bir alan üzerinde dokunmatik tuttum UITextField bu sorun vardı. Boş alanları ortadan kaldırmak için aşağıdaki geçici çözümü kullandım:

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

Benim için ben aşağıda gösterildiği gibi CGContextRef bırakıyordum çünkü bu hatayı alıyordu:

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

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

//    CGContextRelease(context);
}

Sürümün kaldırılması sorunu çözdü


0

UIActivity alt sınıfında imageImage yönteminde görüntü adını yanlış yazdığımda anladım

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

Doğru görüntüyü yazmak benim için çözdü.


0

Uygulamayı simülatörden kaldırın ve tekrar çalıştırın


0

Burada yorum yapan diğerleri gibi aşağıdakilerden herhangi birini yaptığımda bu uyarıyı alıyordum:

Boş bir metin alanında: Çift dokunma, dokunma ve basılı tutma, uzun tek dokunuş.

Bu sadece iOS 7.0.3'ü etkiliyor gibi görünüyor

Etrafında bir çalışma buldum, çalışma alanınız BOŞ değilse uyarı tetiklenmeyecektir.

Bu yüzden textFieldDidBeginEditing'de aşağıdakileri yaptım:

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

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

        pasteboard.string = @" ";

    }
}

Bunu iPhone 4s, 5 ve 5'lerde iOS 7.0.3 için simülatörde test ettim ve artık uyarı almıyorum. Ben de bunu iPhone 6 ve 6'da iOS 8 için simülatörde test ettim, ancak iOS 8'in etkilendiğine inanmıyorum.

Bu çalışmayı keşfetmeden önce iki gün boyunca hayal kırıklığı yaşadım, bu yüzden cevabımın aynı sorunu yaşayanlara yardımcı olacağını umuyorum.


0

UIBezierPath kullanırken ve kontur veya dolgu için renk ayarlarken hata oluşursa, ayarlanan renk kodunu başka yerlerden ziyade drawRect işlevine koyun.


0

Bu kibirli ama benim için çalıştı.

Kurduğum UIImageViewiçinde UITableViewCell's init, bunu bir boyut ve kısıtları verir.

Sonra benim görüş denetleyicisinin cellForRowAtIndexPathbunu yapmak:

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

Ve bu hatayı önler, daha sonra işlevde bunun için gerçek görüntüyü ayarladım UIImageView. Yukarıdaki kod iyi bir varsayılan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.