2010-08-11 76 views
1

我的iPad應用程序出現問題,我需要一次從服務器下載超過10,000個圖像。我成功下載了超過8000張圖像,但是之後我收到了一個異常,例如「程序接收到的信號:」0「 數據格式化程序暫時不可用,將在」繼續「後重新嘗試(加載共享庫時出現未知錯誤)/ Developer /usr/lib/libXcodeDebuggerSupport.dylib「) (gdb)」這在調試器中。我測試了內存管理。內存管理沒有問題。但我仍然有例外。請幫幫我。暫時無法使用數據格式化程序

在此先感謝, Sekhar Bethalam。

回答

2

數據格式化器被使用,使得調試器可以表示一個對象作爲不僅僅是一個指針或整數值以上(例如,數據格式化器允許調試器顯示您的NSNumber一個NSArray內的基礎值,或元素,等等。)。有時候—,我不知道爲什麼—他們只是停止工作。無論如何,數據格式化器不工作的事實不是問題的根源。

沒有看到任何您的代碼(例如您如何下載和/或存儲圖像),診斷問題並不容易。經過一番Google研究之後,似乎iPhone OS上的程序在使用太多資源(不一定只是內存)時會接收到信號0。沒有什麼可以阻止iPhone OS在你想要的時候殺死你的程序。

幾個問題:

  • 你試圖同時或順序下載10,000張?希望順序!
  • 即使您的代碼中沒有檢測到泄漏,您的程序仍可能會使用太多的內存。你是否將這些圖像引用到數組或類似的東西中?
  • 您是否處於緊繃狀態?您的代碼可能不會保留對任何數據/ URL /圖像的引用,但autorelease池可能是。在緊密環境下,有時最好在循環開始時創建一個新的自動釋放池,並在底部釋放它。例如:

    for (NSUInteger i = 0; i < 10000; i++) 
    { 
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
        // do the work to get the image. Objects are automatically added to the 
        // most recently created autorelease pool in the current thread. 
        [pool release]; 
    } 
    
1

這是我的代碼,我上面提到的,

的for(int i = 0;我< 10000;我++) { 的printf(「\ n生成圖像。 .............:%d」,i)的; i ++;

 UIImageView* imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, spotItem.imageWidth, spotItem.imageHight)]; 
     NSData *receivedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://sererpath/prudently/iphone/image_s/e545afbf-4e3e-442e-92f9-a7891fc3ea9f/test.png"]]; 
     imageView.image = [[UIImage alloc] initWithData:receivedData] ; 
     //imageView.image=[UIImage imageNamed:@"1.png"]; 
     [spotItem.subView addSubview:imageView]; 
     [imageView release]; 



    } 

我正在直接下載它們。

+1

是的,問題可能是您在循環的每次迭代中創建兩個自動釋放對象('NSData'和'NSURL')。這意味着一旦你的循環結束,自動釋放池將包含至少20,000個項目(並且誰知道這些20,000個項目總共使用了多少內存!)。在我的回答中嘗試遵循我的建議(在循環開始時創建一個NSAutoreleasePool,並在最後釋放它)。 – dreamlax 2010-08-11 12:46:57

相關問題