2011-04-11 77 views
1

我使用的NSData的URL下載圖像,並使用的NSData將writeToFile崩潰沒有理由

NSData *dataForStorage = [NSData dataWithData:UIImagePNGRepresentation(img)]; 


    BOOL saveResult=[ dataForStorage writeToFile:jpegFilePath options:NSDataWritingAtomic error:&error]; 
    NSLog(@"Write returned error: %@", [error localizedDescription]); 

我的應用程序崩潰隨機,甚至沒有給出一個消息再次保存到本地文件系統,雖然有些文件被保存(隨機地)。當我以調試模式運行應用程序時,我經常看到「EXC_BAD_ACCESS」,但繼續執行成功保存了一些文件。

[self performSelectorInBackground:@selector(loadImageInBackground:) withObject:arr]; 

請建議:

此代碼是在後臺執行從。

+1

你可以發佈崩潰日誌和控制檯日誌嗎? – Joze 2011-04-11 11:02:56

+0

它是iOS上的iPhone應用程序還是MacOS上的Mac應用程序? – Codo 2011-04-11 11:08:51

+0

這是iPad應用程序。這裏是控制檯日誌: 2011-04-11 16:36:59.784 AJiPadPhotos [5881:7203] *** __NSAutoreleaseNoPool():對象0x4e222c類NSHTTPURLResponse autoreleased沒有到位的池 - 只是漏水 2011-04 -11 16:36:59.784 AJiPadPhotos [5881:7203] *** __NSAutoreleaseNoPool():類__NSCFData的對象0x4b41c80自動釋放,沒有池到位 - 只是漏水 2011-04-11 16:36:59.785 AJiPadPhotos [5881:7203 ] *** __NSAutoreleaseNoPool():類NSConcreteData的對象0x4e23ba0自動釋放,沒有池到位 - 只是泄漏 – 2011-04-11 11:09:57

回答

1

只是一個瘋狂的猜測:arr是一個自動釋放的對象,所以有時它會在您的選擇器被調用之前被釋放。嘗試使用[arr copy]並在保存後釋放它。

+1

爲各位保留了各種performSelector方法中的withObject:參數,所以我不認爲這是一個問題。 – 2011-04-11 14:25:59

+0

謝謝@Marcelo,但沒有幫助:( 任何其他想法? – 2011-04-12 06:11:54

1

你的代碼中的一個問題就是你在一個沒有autorelease池的線程中運行代碼,但使用的功能需要一個。將下面的代碼放入loadImageInBackground方法中:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// existing code 

[pool drain]; 

這可能只是幾個問題之一。如需進一步的幫助,我們需要查看崩潰的堆棧跟蹤。

+0

你好科多, 謝謝你的答覆。我已經有了這些,爲了簡潔起見,在這裏排除了這些。還有什麼可以做的? – 2011-04-13 05:41:13

+0

是的,將崩潰的堆棧跟蹤添加到問題中。 – Codo 2011-04-13 05:58:16

0

我有EXACT相同的問題,但事實證明,問題是別的:我的網址過早發佈。到底這是我做過什麼和它的工作:

我提出這個呼籲:

[self performSelectorInBackground:@selector(downloadData:) withObject:nil]; 

這是方法:

// URL - (NSString) URL for file 
// filePath - (NSString) save location on device 
-(void)download:(NSString *)URL 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]]; 
    [data writeToFile:filePath atomically:YES]; 
    [pool release]; 
} 

所以,我認爲你的下載代碼是正確的,但還有一些其他變量可能會提前釋放(可能是您的路徑)。

希望這會有所幫助!我知道在這個網頁上的其他答案爲我工作。