2012-07-24 51 views
2

我已閱讀很多關於低內存警告崩潰的帖子,但我無法解決我的應用程序崩潰的問題。儀器的分配顯示實時字節,範圍從2-7MB。它永遠不會超過7或7.5MB,但仍然是應用程序崩潰。應用程序崩潰與非常低的內存使用情況iphone/ipod

我讀了一些鏈接,它告訴分配和活動監視器顯示不同的內存使用值。如前所述,Allocations將顯示最大7-7.5MB,但活動監視器顯示應用程序啓動時約75MB的使用情況,並且在我使用該程序時,它會開始增加和減少。它會上升到110-120MB,然後降低到75-80MB。

一些鏈接說,看看VM跟蹤器中的髒大小和常駐大小。當我檢查VM Tracker時,髒大小將從30MB開始,並隨着我使用該應用程序而開始增加。它超過400MB。我正在使用約150張圖片,其中約70-80張爲1024x1024尺寸,約35張圖片爲110x110,其餘圖片爲3000x4000張。所有這些圖像最初都是png格式,我已經編程轉換爲JPG + ALPHA並作爲資源添加到應用程序中。每當相應的圖像需要加載時,我將JPG + ALPHA圖像分成16個部分,最後加入它們以獲得原始圖像。我這樣做是因爲當我試圖加載分辨率爲3000x4000的圖像時,內存在Allocations中一直添加到40-45MB,所以使用了這種方法。該方法確保內存永遠不會超過10MB。

所有這些記錄和統計數據均使用模擬器進行測量。

應用程序不會在模擬器上崩潰,但會在實際設備上崩潰。我正在使用iPad2進行測試。

請幫我解決這個問題。我被困在過去的兩天,完全沮喪的看到應用程序崩潰。

+1

搜索'heapshots',這是分配工具的功能。您可以跟蹤在特定時間間隔內獲得了alloc'd和dealloc'd的內存。另外,某些圖像處理方法使用緩存,如'imageNamed'。你也可以用'NSAutoreleasePool'來嘗試,因爲同時在內存中有很多圖像。 – Templar 2012-07-24 13:01:01

+0

崩潰日誌說什麼...? – 2012-07-24 13:11:22

+0

感謝您的回覆@Templar。我在任何地方都使用過NSAutoreleasePool,我正在使用initWithContentsOfTheFile來加載圖像的內容。將試用heapshots並在此發佈結果。 – Srikanth 2012-07-24 13:12:07

回答

0

此編碼是否正確?

UIImageView* framebadgeOrAccessoryImage = [[UIImageView alloc]initWithFrame:sizeOfFrameOrAccessoriesView]; 
    [framebadgeOrAccessoryImage setCenter:imageArea.center]; 
    [framebadgeOrAccessoryImage setContentMode:UIViewContentModeScaleAspectFit]; 
    [framebadgeOrAccessoryImage setImage:badgeOrAccessoryImage]; 
    [framebadgeOrAccessoryImage setTag:iObjectTag]; 
    [framebadgeOrAccessoryImage setObservationInfo:@"BadgeAccessories"]; 
    [framebadgeOrAccessoryImage setExclusiveTouch:YES]; 

    iObjectTag++; 

    [framebadgeOrAccessoryImage setMultipleTouchEnabled:YES]; 
    [framebadgeOrAccessoryImage setBackgroundColor:[UIColor clearColor]]; 
    [framebadgeOrAccessoryImage setUserInteractionEnabled:YES]; 

    [imageArea addSubview:framebadgeOrAccessoryImage]; 

selectedItem = framebadgeOrAccessoryImage; 

    [framebadgeOrAccessoryImage release]; 

我用我的其他方法「framebadgeOrAccessoryImage」用我所設定的標籤。我是否必須按照我在代碼的最後一行中所做的那樣釋放「framebadgeOrAccessoryImage」,或者在釋放代碼後將它分配給nil?

「framebadgeOrAccessoryImage」在這裏與名稱「selectedItem」一起使用。

- (void)panRecognized:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    if(selectedItem.image && [gestureRecognizer isEnabled]) 
    { 
     UIImageView *piece = selectedItem; 

     if ((([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged)) && [((NSString*) [piece observationInfo]) isEqualToString:@"BadgeAccessories"]) 
     { 
      CGPoint translation = [gestureRecognizer translationInView:[piece superview]]; 
      [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)]; 
      [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]]; 

     } 

     if ([gestureRecognizer state] == UIGestureRecognizerStateEnded ||[gestureRecognizer state] == UIGestureRecognizerStateCancelled || [gestureRecognizer state] == UIGestureRecognizerStateFailed) 
     { 
      if(CGRectContainsPoint([[self view]viewWithTag:RECYCLEBIN_TAG].frame, [gestureRecognizer locationInView:imageArea])) 
      { 
       NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init]; 
       [objectsAdded removeObjectForKey:[NSString stringWithFormat:@"%d",selectedItem.tag]]; 
       [pool release]; 
       [UIView beginAnimations:NULL context:nil]; 
       [UIView setAnimationBeginsFromCurrentState:YES]; 
       [UIView setAnimationDuration:0.4]; 
       [UIView setAnimationDidStopSelector:@selector(propDeleted:finished:context:)]; 
       [UIView setAnimationDelegate:self]; 

       [selectedItem setFrame:CGRectMake(selectedItem.frame.origin.x, selectedItem.frame.origin.y, 5, 5)]; 
       selectedItem.center = [[[self view]viewWithTag:RECYCLEBIN_TAG]center]; 
       [UIView commitAnimations]; 
      } 
      else 
      { 
       [self applyEffectOnTouch:0]; 
      } 
     } 
    } 
} 
+1

請顯示使用'framebadgeOrAccessoryImage'的其他代碼。這聽起來像是這個問題的一個可能的地方。但是,請不要把你的代碼放在這裏。這個區域是爲了解答。使用問題下方的**編輯**鏈接,並將代碼放入您的問題中。謝謝。 – Nate 2012-07-24 13:41:16

0

您嘗試加載的圖像非常大。也許你應該考慮使用CATiledLayer來顯示圖像。你可以找到蘋果類定義here

還要考慮讓您的圖像更容易渲染與減少圖片的內存使用之間的差異。如果將圖像分成較小的部分,您將減少單個繪圖負載,但如果每個圖像都加載到內存中,您仍會遇到內存問題。

平鋪圖層顯示非常大的圖像,同時通過嘗試僅加載可見圖塊來減少內存使用量。

此外,您的模擬器沒有實際設備的內存限制。您應該在實際設備上執行所有壓力測試。

編輯:你也應該避免使用UIImage imageNamed,因爲它緩存圖像,可以使你的內存問題更加嚴重。改爲使用imageWithContentsOfFile。

+0

謝謝。我正在使用「imageWithContentsOfFile」方法。由於我的包中有JPG + ALPHA分隔圖像,因此我需要在將這些圖像顯示在屏幕上之前將它們轉換爲png文件。我無法使用CATiledLayer,因爲我必須先將JPG + ALPHA轉換爲png。正如我在之前的文章中所說的,分配會將內存記錄到最大7-7.5MB,但虛擬機跟蹤器中的髒大小達到了大約400MB。我該如何減少骯髒的尺寸,或者如何聲稱這部分內存? – Srikanth 2012-07-25 05:30:55

相關問題