2013-10-25 43 views
214

我讀過儘可能多的搜索結果,我可以在這個可怕的問題上找到,不幸的是,每個人似乎都專注於特定的函數調用。在iOS 7.0和系統降級下的無效上下文0x0

我的問題是,我從多個函數中獲取相同的錯誤,我猜測正在從我使用的函數回調。

更糟糕的是,實際的代碼是在另一個項目中導入的自定義私有框架中,因此調試並不那麼簡單?

任何人都可以指向正確的方向嗎?我有一種感覺,我錯誤地調用了某些方法或錯誤的上下文,但是在這一點上,xcode的輸出並不是非常有用。

:CGContextSetFillColorWithColor:invalid context 0x0。這是 一個嚴重的錯誤。此應用程序或其使用的庫正在使用無效的上下文,從而導致系統穩定性和可靠性的總體降級 。此通知是禮貌性的:請 修復此問題。這將成爲即將到來的更新中的致命錯誤。

:CGContextSetStrokeColorWithColor:無效的上下文0x0。這 是一個嚴重的錯誤。此應用程序或其使用的庫正在使用無效的上下文,從而導致整個系統穩定性和可靠性降低。此通知是 禮貌:請解決此問題。在即將到來的更新中,這將成爲致命錯誤 。

CGContextSaveGState:invalid context 0x0。這是一個嚴重的錯誤。 此應用程序或其使用的庫正在使用無效的上下文 ,因此有助於穩定性和可靠性的整體降級系統。此通知是禮貌性的:請修復這個問題 。這將成爲即將到來的更新中的致命錯誤。

:CGContextSetFlatness:無效的上下文0x0。這是一個嚴重的 錯誤。此應用程序或其使用的庫正在使用無效的上下文,從而有助於系統穩定性和可靠性的總體降級。此通知是禮貌性的:請 修復此問題。這將成爲即將到來的更新中的致命錯誤。

:CGContextAddPath:invalid context 0x0。這是一個嚴重的 錯誤。此應用程序或其使用的庫正在使用無效的上下文,從而有助於系統穩定性和可靠性的總體降級。此通知是禮貌性的:請 修復此問題。這將成爲即將到來的更新中的致命錯誤。

:CGContextDrawPath:invalid context 0x0。這是一個嚴重的 錯誤。此應用程序或其使用的庫正在使用無效的上下文,從而有助於系統穩定性和可靠性的總體降級。此通知是禮貌性的:請 修復此問題。這將成爲即將到來的更新中的致命錯誤。

:CGContextRestoreGState:無效的上下文0x0。這是一個嚴重錯誤 。此應用程序或其使用的庫正在使用無效的上下文,從而導致系統穩定性和可靠性的總體降級 。此通知是禮貌性的:請 修復此問題。這將成爲即將到來的更新中的致命錯誤。

:CGContextGetBlendMode:無效的上下文0x0。這是一個嚴重的 錯誤。此應用程序或其使用的庫正在使用無效的上下文,從而有助於系統穩定性和可靠性的總體降級。此通知是禮貌性的:請 修復此問題。這將成爲即將到來的更新中的致命錯誤。

當呈現自定義視圖或其繼承類之一時可能會發生這些錯誤。在這一點,他們多次產卵,直到鍵盤不會提供任何輸入。觸摸事件仍然被註冊,但系統變慢,最終可能導致未分配的對象錯誤。

編輯#1:我確實可以訪問正在導入的框架,但是在導致問題的類中沒有看到任何奇怪的東西。

編輯#2:我剛剛收到一封電子郵件,iOS 7.1已經發布給開發者。我很好奇,看看這是否消失,或變得更糟,或可以解決。

+8

我們的應用中出現同樣的錯誤 - 從表單上的標準文本框中獲得。如果在鍵盤顯示過程中多次點擊文本框,則會顯示此錯誤。 – 2013-12-09 16:38:17

+0

同樣在這裏。有時數百個這些日誌,有時爲零。我認爲這是因爲我重寫了drawRect:但它似乎是別的。現在忽略它。 – Krumelur

+2

我剛剛完成了關於developer.apple.com的第一個教程(複製Apple建議的代碼),我也遇到了同樣的錯誤。如果更有經驗的程序員看看那個教程,他們可以追蹤這個問題的原因。 –

回答

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)但是不要太快認爲這是問題。由於這是一種自定義的觀點,因此值得首先研究@羅布的觀點。 –

+2

這是發生在我身上..我在IB上放置一個uitextfield,得到該錯誤和鍵盤不會出現..有沒有解決方案?謝謝 – Frade

+0

@Frade對我來說,儘管出現了嚴重的錯誤信息,但鍵盤仍然正常運行。所以你可能有一個額外的問題。 – bilobatum

42

這些類型的錯誤是在歷史調用核心圖形功能的結果而不是當被內drawRect或類似UIGraphicsBeginImageContextUIGraphicsEndImageContext(或其它的UIKit的功能和其它這些開始和結束的上下文)的呼叫之間建立的範圍內。

話雖如此,但bilobatum是正確的,這個特定的錯誤序列可能是他在他的答案中提到的那個iOS 7 bug的結果。如果在你的iOS6目標中沒有看到這些錯誤,或者在這個私有框架的快速掃描之後,你沒有發現任何可疑的Core Graphics調用,它可能就是這個iOS 7的錯誤。良好的捕獲,bilobatum!

+0

我確實在調用drawRect的私有框架中有一個視圖。雖然我沒有直接調用任何提及的方法,但我唯一的假設是該類中的代碼有某種相關性。然而,正如我所提到的,在以前的iOS中,一切都運行平穩。 –

+0

爲了完成(這是谷歌的最佳搜索結果),我想要注意的是,OSX 10.11.3上的隱含錯誤沒有改變,並且像Rob說的那樣,通過在drawRect或另一個上下文之外創建繪圖函數相關功能。 –

199

如果您好奇哪些代碼導致這些日誌,您可以在CGPostErroradd a symbolic breakpoint

+2

感謝您提供有關CGPostError的提示。我在上面放了一個斷點,看起來我沒有做任何事情來引起這個問題。在我的情況下,它發生在主線程上,但不在我的代碼中。 –

+10

Votin'up up,因爲雖然它不是這種特定情況下的解決方案,但它經常會突出顯示故障所在的位置,當它位於程序員自己的代碼範圍內時。 – Ash

+27

這是一個很好的建議。對於那些不熟悉符號斷點或者如何在Xcode中添加它們的人,這裏是Apple的文檔。 https://developer.apple.com/library/ios/recipes/xcode_help-breakpoint_navigator/articles/adding_a_symbolic_breakpoint.html –

15

在我來說,我已經在這個代碼得到這些錯誤:

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

,因爲我發現 - 在我的代碼中,這個調用沒有必要,因爲填充將以其他方式完成 - 所以我只是將其刪除。

+2

準確地說我的問題 - 謝謝! – malaki1974

19

我有一個簡單的UITextField(鍵盤沒有顯示和控制檯上的許多不同的無效上下文錯誤消息)的這個問題。 我只是尋找另一個問題上的SO找到一個解決辦法:Cannot find executable for CFBundle CertUIFramework.axbundle

只要做到:在iOS模擬器

點擊>重置內容和設置...,然後再次運行。

的問題不應該存在了

+2

這工作對我 – Esqarrouth

2

我不得不情況下,從UIGraphicsGetCurrentContext()返回的上下文是NULL,如果你嘗試使用它的任何東西出現此消息。在呼叫drawRect:之前,如果您直接撥打drawRect:而不是[view setNeedsDisplay],則您有責任在UIGraphicsPushContext之前使用UIGraphicsPushContext推送上下文,否則可能會導致尚未設置上下文。我的直覺是,在iOS 7之前,上下文被推到init的視圖上,現在在iOS 7上,在第一次調用drawRect:之前不會推送上下文。我懷疑有些UIKit代碼直接調用drawRect:,這就是爲什麼即使沒有自定義繪圖正在完成時也會出現一些代碼的問題。

解決方案(如果這樣做自定義繪製):

  1. 不要直接調用drawRect:,使用[view setNeedsDisplay]或者如果你需要立即繪製使用[view.layer draw]
  2. 在你drawRect:獲取上下文,但不使用它在這個if語句的正文之外if (context) {<do drawing here>}
5

我有這個相同的問題,我忘了導入QuartzCore/QuartzCore.h,這解決了我的問題,這些錯誤。

#import <QuartzCore/QuartzCore.h> 
+0

這是修復所有 –

1

我是從環境中使用以下代碼創建的UIImage:

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

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

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

因此我得到的誤差。

所以我刪除了派生數據內容,重新啓動了我的XCode。它的工作。

+0

然後是什麼解決方案? – Geek

+1

@Geek,更新的解決方案。刪除DerivedData內容並重新啓動。 – Meet

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 
} 
2

在受影響的視圖關閉自動佈局導致此錯誤消失在某些情況下,你在哪裏放置和移動的用戶界面元素(特別是自定義的,其是在視圖中以編程方式繪製)。當我發現這種症狀時,我正在使用JVFloatLabeledTextField。

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

確保size.width或size.height不爲0,

可以符號添加斷點CGPostError檢查

+0

所以......在CGPostError中添加一個符號斷點,如何查看當前的大小? – Cris

+0

您可以通過命令+ 6查看「顯示調試導航」中的函數調用堆棧。然後你點擊樹,然後你可以回到你的函數來查看變量。 – lbsweek

+0

是的,我正在通過imageview來製作這張幻燈片,但是,發現它的大小爲零。終於在2天后得到解決:D。 – JiteshW

0

對我來說,得到的答案是,我是不必要的釋放圖形上下文在drawRect:。在CGPostError上拋出一個符號斷點指向我的罪魁禍首。

0

因爲我已經設置

textfield.delegate = self 

沒有實施任何委託例程得到這個錯誤。刪除該行解決了我的問題

4

我得到這個錯誤,因爲我正在使用一個UIColor對象作爲在CATextLayer對象中使用的NSAttributedString字典中的屬性。我改變了字典來保存CGColorRef,錯誤消失了。

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

在某些情況下,您可能需要包含行#import <QuartzCore/QuartzCore.h>

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

我得到了它,當我在activityImage輸入了錯誤的圖像名稱方法在UIActivity子類

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

鍵入正確的圖像解決了它對我來說。

0

卸載從模擬器的應用程序,然後再次運行

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 doesn't work。 並感謝幫手。

2

我在我的自定義CALayer實現的drawInContext(..)方法中出現此錯誤。 UIBezierPath嘗試使用UIGraphicsGetCurrentContext(),它在默認情況下在自定義圖層中爲零。如果您使用的不是一個UIView對象做你的圖紙,但是,你必須推動一個有效的上下文到使用UIGraphicsPushContext功能手動堆

- 該online documentation解釋得很清楚。

下面是終於有我的評語內嵌工作的代碼(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

在我的情況下創建與帽resible圖像時,我在此警告插圖。問題在於我沒有在「不加蓋」的區域留下至少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個點 – ribeto

5

直接的答案: 問題是因爲使用了核芯顯卡的元素,如CGContext上等其他比- (void)drawRect:(CGRect)rect此方法。

現在,請將您的代碼移至此方法。它會盡快給你警告/錯誤。

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並不再收到警告。我也在iOS 6和iOS 6的模擬器上測試了這一點,但我不相信iOS 8會受到影響。

在發現這項工作之前,經歷了兩天的挫折,所以我真的希望我的回答能幫助那些有同樣問題的人。

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

如果當您使用UIBezierPath並設置顏色發生錯誤對於筆畫或填充,將設置的顏色代碼放在drawRect函數中而不是其他地方。

相關問題