2014-11-06 93 views
4

我知道它有點泛泛,但是我們做了一切可能的事情來找到它是什麼,而我們卻做不到。Malloc創建UIImage時崩潰?

我們有這樣的崩盤發生在這裏和那裏,並非總是如此,在這條線:

[self.imageOperationQueue addOperationWithBlock:^ 
{ 
    if(!data) 
     return ; 
    UIImage *image=[[UIImage alloc] initWithData:data]; // *** CRASH ! 

崩潰日誌說:

malloc: *** error for object 0x7fecdb06e5c0: double free 
*** set a breakpoint in malloc_error_break to debug 

正如你所看到的,並在我們的檢查, data不是零,當我們創建圖像時,我們也嘗試過:[UIImage initWithData:data];沒有分配,但同樣的事情。

編輯: 這是怎樣的代碼看起來像這樣一行之後:

 if(!data) 
      return ; 


     UIImage *image=[[UIImage alloc] initWithData:data]; 
     UIImageView *modelview=[self.allImageView objectAtIndex:index]; 
     float newH=image.size.height* (1.65*modelview.frame.size.width/image.size.width); 
     CGSize s=CGSizeMake(1.65*modelview.frame.size.width, newH); 

     if (image) 
     { 
      UIGraphicsBeginImageContextWithOptions(s , NO, 0.0); 
      [image drawInRect:CGRectMake(0, 0, s.width, s.height)]; 

      image = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 
     } 
+0

是的,在malloc_error_break中設置一個斷點來調試和啓用殭屍 – Lefteris 2014-11-06 10:24:33

+0

http://stackoverflow.com/questions/10587266/double-free-set-a-breakpoint-in-malloc-error-break-to-debug-在弧中通過這個鏈接。 – BHUMICA 2014-11-06 11:03:50

+0

何不乾脆[UIImage的頁頭] initWithData:data.copy],看看它是如何去 – 2014-11-06 13:00:07

回答

3

data很可能被過度釋放另一個線程。雙免費表示內存管理不平衡,而不是無指針。

如果讓我預測的問題,我猜你從一個不安全的指針,一個CoreGraphics中調用的可能的結果,或在NSData得到那你背後釋放malloc分配的內存產生data。這裏是我的理論是如何工作的:

  • 您在不安全的存儲創建NSData
  • 創建這個操作塊,這使在NSData
  • 別的地方一個保留,你釋放底層的內存
  • 的操作塊運行
  • 這是最後一行使用data
  • ARC注意到並因此釋放data在半圓形在
  • 釋放data通向free()
  • 內存已經由別人
  • 崩潰中解脫出來

的關鍵是NSData通常應該是其存儲的唯一所有者;如果不是,那麼你必須非常小心,特別是在多線程操作中。

+0

謝謝 - 請檢查我的編輯:你對我之後使用核心圖形,但崩潰顯示它的那一行。所以,底線我如何改變這段代碼來阻止這種情況發生?每當我想從服務器上加載4張下一張圖片時,我都會使用這個塊(經常延遲加載) – Curnelious 2014-11-06 12:50:55

+1

@Curnelious - 當你遇到失敗的行時,就太遲了。 – 2014-11-06 12:53:24

+0

錯誤可能不在這裏。它可能在代碼中生成數據然後調用它。 – 2014-11-07 14:39:26