2009-04-09 17 views
0

NSURLConnectionを以下のように使用しています。このクラスについて3つの質問があります。私はURL値を連結すると、デバッガは二度ではなく、その上の行を次の行を打つ:NSURLConnectionの失敗の質問

if (theConnection){ 

二時間、私は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長]を通過するには、

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

がヒットします周りの1600の値を持ちます。 receivedDataに要求している実際のデータがあるかどうかを正確にチェックする方法はありますか?ターゲットファイルは約7MBですが、1.5MBから9MBの範囲で変更できます。私が要求したリソースはありませんでしたが、それは何かを示していますか?

3.)私は私のアプリケーションデリゲートでこれをやっています。唯一のプロトコルはUIApplicationDelegateです。代理人がいない場合、NSURLConnectionメソッドはどのように機能しますか?

答えて

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

違いは、これらの一つは、あなたが所有していない何かを解放して逃げると他にはないことができますということです。

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

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

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

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

他のデータとは対照的に?ハッシュを使用することもできますが、正しいハッシュがどのように決定されるかはあなた次第です。しかし、サーバがあなたに間違ったファイルを与えないという信念を持つ方が簡単かもしれません。

私が要求したリソースはありませんでしたが、それは何かを示していますか?

はい。 connection:didReceiveResponse:を実装し、応答コードを確認してください。

サーバがmod_spelingなどを使用している場合は、エラーを返す代わりにURLを修正することができます。たとえば、「afile.mp」をリクエストした「afile.mp」を実際に変更します存在する。

3)私は、このアプリケーションの代理人でこれをやっています。唯一のプロトコルはUIApplicationDelegateです。代理人がいない場合、NSURLConnectionメソッドはどのように機能しますか?

あなたはdelegate:selfと言っています。あなたは接続の代理人です。

Macでは、少なくとも、NSURLConnectionはメソッドをNSObjectに分類します。したがって、少なくともオペレーション形式では常に利用可能です。これらの実装をオーバーライドするので、NSURLConnectionがそれらのメッセージを委譲(あなた)したときに、NSURLConnectionはあなたが提供した実装に行きます。

+0

1.)どのようにそれを行うことができますか?どちらも割り当てられません。あなたが応答コードを言うとき、あなたは提案ファイル名かMIMETypeを意味しますか?レスポンスコードは表示されません。 3.)クール - それはどこに文書化されていますか?ありがとう。 – 4thSpace

+0

1.私が言ったように、ref-countingメソッドは文字列リテラルオブジェクトのno-opsです。しかし、それに頼らないでください。また、私が言ったように、あなたが割り当てていないことを知っています:それはあなたがそれを解放すべきではない理由です。 2.いいえ、私は応答コードを意味しました。私が言ったデリゲートメソッドを実装します。 3. NSURLConnectionのドキュメント。 –

+0

レスポンスオブジェクト(デリゲートメソッドで)を取得したら、statusCodeメッセージを送信してレスポンスコードを取得します。 http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSHTTPURLResponse_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHTTPURLResponse/statusCode –

関連する問題