2

NSDATA を使用して URL から画像をダウンロードし、それらを使用してローカル ファイル システムに保存しています。

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];

提案してください。

4

3 に答える 3

2

コードの問題の 1 つは、自動解放プールのないスレッドでコードを実行しているが、自動解放プールを必要とする関数を使用していることです。次のコードを loadImageInBackground メソッドに挿入します。

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

// existing code

[pool drain];

これはおそらくいくつかの問題の 1 つにすぎません。さらに支援が必要な場合は、クラッシュのスタック トレースを確認する必要があります。

于 2011-04-12T08:55:44.220 に答える
1

大げさな推測 :arrは自動解放されたオブジェクトであるため、セレクターが呼び出される前に割り当てが解除されることがあります。使ってみて[arr copy]、保存してから解放してください。

于 2011-04-11T12:25:23.493 に答える
0

私はまったく同じ問題を抱えていましたが、問題は別のものであることが判明しました.私のURLが時期尚早にリリースされていました. 最後に、これは私がやったことであり、うまくいきました:

私はこの電話をかけました:

[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];
}

したがって、ダウンロード コードは正しいと思いますが、他の変数が早期に割り当て解除されています (おそらくパス)。

お役に立てれば!このページの他の回答が役に立ったことは知っています。

于 2011-05-18T17:59:01.970 に答える