0

以下にリストされているように、私は NSURLConnection を使用しています。このクラスについて 3 つの質問があります。URL 値を連結すると、デバッガーはこの行に 2 回ヒットしますが、その上の行にはヒットしません。

if (theConnection){

2 回目は EXC_BAD_ACCESS を取得します。最初の URL 割り当て (コメント アウト) を使用すると正常に動作します。

1.) 違いは何ですか?

- (void)applicationDidFinishLaunching:(UIApplication *)application {

//NSString *url = @"http://www.abc.com/afile.mp4";

NSString *temp = @"afile.mp4";
NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp];

theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
                                     cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
[url release]; 

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    receivedData=[[NSMutableData data] retain];
}

2.) ファイル名を afile.mp に変更すると、リクエストは通過し、[receivedData length] の値は約 1600 になります。

    - (void)connectionDidFinishLoading:(NSURLConnection   *)connection

打たれる。receivedData に要求している実際のデータがあるかどうかを正確に確認する方法はありますか? ターゲット ファイルは約 7 MB ですが、1.5 MB から 9 MB までさまざまです。リクエストしたリソースがありませんでしたが、それを示すものはありますか?

3.) アプリデリゲートでこれを行っています。そこにある唯一のプロトコルは UIApplicationDelegate です。デリゲートがない場合、すべての NSURLConnection メソッドはどのように機能しますか?

4

1 に答える 1

4

1.) 違いは何ですか?

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    //NSString *url = @"http://www.abc.com/afile.mp4";
    NSString *temp = @"afile.mp4";
    NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp];

    theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
                                                                             cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    [url release]; 

違いは、これらのうちの 1 つは自分が所有していないものを解放することを許し、もう 1 つは所有していないことです。

あなたはそれを割り当てたり、コピーしたり、保持したりしていないので、あなたはそれを所有していないので、解放しないでください。

実装の詳細として、文字列リテラルは参照カウントを実装していません。文字列リテラル オブジェクトは、保持または解放しようとすると無視されます。そのため、文字列リテラルを解放するバージョンはクラッシュせず、新しい文字列を作成して解放するバージョンはクラッシュします。ただし、これは実装の詳細です。これに依存しないでください。所有していないものをリリースするとクラッシュが発生することを常に想定してください。

receivedData に要求している実際のデータがあるかどうかを正確に確認する方法はありますか?

エラー文書とは対照的に?応答コードを確認してください。

他のデータとは対照的に?期待する正しいハッシュをどのように決定するかはあなた次第ですが、ハッシュを使用することもできます。ただし、サーバーが間違ったファイルを提供しないと信じている方がおそらく簡単です。

リクエストしたリソースがありませんでしたが、それを示すものはありますか?

はい。connection:didReceiveResponse:応答コードを実装して確認します。

サーバーが mod_speling などを使用している場合、エラーを返すのではなく、URL を修正することがあります。たとえば、要求した「afile.mp」を実際に存在する「afile.mp4」に変更します。

3.) アプリデリゲートでこれを行っています。そこにある唯一のプロトコルは UIApplicationDelegate です。デリゲートがない場合、すべての NSURLConnection メソッドはどのように機能しますか?

あなたが言っdelegate:selfたので、あなたは接続の代理人です。

少なくとも Mac では、NSURLConnection はメソッドを NSObject に分類するため、少なくともノーオペレーション形式でいつでも利用できます。これらの実装をオーバーライドするため、NSURLConnection が接続デリゲート (あなた) にこれらのメッセージを送信すると、指定した実装が通過します。

于 2009-04-09T06:57:35.107 に答える