2010-11-10 88 views
6

我有一個應用程序,當我在UIScrollView上用「EXC_BAD_ACCESS」調用addSubview時,我正在寫這個應用程序。它只在iPhone 3G上以釋放模式進行,並且僅在設備上進行。我的作品在所有這些其他配置罰款:iPhone應用程序僅在3G上的發佈模式下崩潰

iPhone 3G - 調試模式 的iPhone 3GS - 調試和發佈模式 iPhone 4 - 調試和發佈模式 模擬器 - 所有。

此外,爲什麼會出現這種情況沒有理性的原因。我的對象不是由我的任何代碼發佈的。

回答

2

我建議您使用NSZombieEnabled來找出是什麼導致對內存訪問不良。

  • 您是否使用DEBUG/RELEASE定義來分支您的代碼?
  • 您是否使用SDK版檢查器來分支您的代碼?

否則我看不到您的應用程序在不同的設備/配置上可能表現如何不同。

+0

我有NSZombieEnabled,但它在這種情況下不起作用。另外,我沒有使用任何SDK版本檢查器。在我的HTTP庫中有一些微不足道的東西,但這與代碼的這個區域無關。 – whitehawk 2010-11-10 23:43:28

+0

你在哪三個設備上運行了哪個iOS?你有使用DEBUG/RELEASE定義的條件編譯嗎?你提到一個被釋放的對象,你可以發佈一些代碼嗎? – 2010-11-10 23:54:06

0

我從來沒有「解決」這個,但我確實追查了違規代碼。我懷疑這段Quartz代碼中的某些東西導致了內核深處的緩衝區溢出 - 並且它僅在3G上引起了一個問題。一些設置該段的不包括在內,但這個肯定是在那裏發生的事情:

gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations); 
CGContextAddPath(context, path); 
CGContextSaveGState(context); 
CGContextEOClip(context); 
transform = CGAffineTransformMakeRotation(1.571f); 
tempPath = CGPathCreateMutable(); 
CGPathAddPath(tempPath, &transform, path); 
pathBounds = CGPathGetPathBoundingBox(tempPath); 
point = pathBounds.origin; 
point2 = CGPointMake(CGRectGetMaxX(pathBounds), CGRectGetMinY(pathBounds)); 
transform = CGAffineTransformInvert(transform); 
point = CGPointApplyAffineTransform(point, transform); 
point2 = CGPointApplyAffineTransform(point2, transform); 
CGPathRelease(tempPath); 
CGContextDrawLinearGradient(context, gradient, point, point2, (kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation)); 
CGContextRestoreGState(context); 
CGGradientRelease(gradient); 
0

你說「我對象不受任何我的代碼發佈」。我發現在Objective-C中遇到代碼沒有明確釋放對象但對象已經釋放完全相同的情況並不罕見。例如,我的頭頂,讓我們說,你有一個保留計數爲1的對象#1,然後釋放它,但意外地自動釋放它。然後,之前自動釋放池實際耗盡,您分配一個新的對象#2 - 這是不可思議的,這個新的對象#2可以分配在對象#1相同的地址。所以當autorelease池隨後被耗盡時,它會意外釋放對象#2。

+0

嘿,經過廣泛的靜態分析,使用泄漏工具進行性能分析以及仔細檢查我的代碼之後,我相當確信這不是泄漏問題。我可能是錯的,但我已經發布了上面的代碼片段。隨意去看看。 – whitehawk 2010-11-23 17:27:34

1

我可以建議將發佈設置的優化級別更改爲「無」。 我幾次遇到同樣的問題(使用不同的應用程序)並以這種方式解決它。

12

我最近有同樣的問題,但我不完全確定原因是一樣的。我可以告訴你的是什麼解決了我的問題(儘管我仍然不完全滿意解決方案)。最後,它看起來像是一個編譯器問題,這可能證實其他人對編譯器優化所說的話。 我正在使用Xcode 4.0(構建4A304a)。問題在於LLVM編譯器2.0代碼生成。一個特別的關鍵:「優化級別」

調試設置爲「無」。 發佈被設置爲「最快,最小」

將發佈更改爲「無」修復了崩潰(同樣將Debug更改爲「Fastest,Smallest」導致應用程序在啓動時崩潰)。

+0

這是我的答案!非常感謝! – datayeah 2015-03-10 16:48:34