NSURLConnection障害質問
-
06-09-2019 - |
質問
私はNSURLConnectionを使用しています。私はこのクラスの3つの質問を持っています。私はURL値を連結すると、デバッガは二回、このラインを打つが、それ以上ではない行ます:
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長は】周りに1600の値を有します - (void)connectionDidFinishLoading:(NSURLConnection *)connection
ヒットを取得します。 receivedDataは、あなたが要求している実際のデータを持っている場合は正確に確認する方法はあります。ターゲットファイルは7メガバイト程度であるが、1.5メガバイトから9メガバイトの間で変えることができます。私が要求されたリソースがありませんでしたが、何がそれを示しているのでしょうか?
3。)私は私のアプリデリゲートでこれをやっています。唯一のプロトコルはUIApplicationDelegateあります。彼らのためにデリゲートがない場合、どのようNSURLConnection方法の全てが動作していますか?
解決
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];
違いは、これらの一つは、あなたが所有していないと他にはない何かを解放して逃げることができますということです。
あなたは、それをALLOCそれをコピー、またはそれを保持して、あなたはそれを所有していないので、それを解放しませんしませんでした。
実装の詳細として、文字列リテラルは、参照カウントを実装していません。あなたが保持またはそれらを解放しようとすると、文字列リテラルのオブジェクトはあなたを無視します。それはあなたが文字列リテラルをリリースバージョンがクラッシュしない理由だし、あなたが行う新しい文字列とリリースを作成したバージョン。しかし、これは実装の詳細-ドントは何のためにそれに依存しています。常にあなたが所有していない何かを解放すると、クラッシュが発生することを前提とします。
receivedDataはあなたが要求している実際のデータを持っている場合は正確に確認する方法はあります。
エラー文書とは対照的に?応答コードをチェックします。
いくつかの他のデータとは対照的に?あなたはあなた次第だろう期待する正しいハッシュを決定する方法が、あなたは、ハッシュを使用することができます。しかし、それだけでサーバーがあなたに間違ったファイルを与えないだろうという信念を持っている方が簡単でしょう。
私は要求されたリソースがありませんでしたが、何がそれを示しているのでしょうか?
はい。 connection:didReceiveResponse:
を実装し、応答コードをチェックします。
サーバはmod_spelingまたは類似のものを使用している場合、それはあなたが実際に存在する「afile.mp4」に要求されたという「afile.mp」変更することで、代わりにエラーのために例を返すのあなたのURLを補正してもよいことに注意してくださいます。
3。)私は私のアプリデリゲートでこれをやっています。唯一のプロトコルはUIApplicationDelegateあります。彼らのためにデリゲートがない場合、どのようNSURLConnection方法の全てが動作していますか?
あなたは、接続のデリゲートしているので、delegate:self
と述べています。
Macの場合、少なくとも、NSURLConnectionカテゴリNSObjectの上に方法なので、彼らは、少なくとも無操作の形で、常に利用可能です。あなたはNSURLConnectionは、あなたの接続のデリゲート(あなた)それらのメッセージを送信するときにそう、彼らはあなたが提供する実装に通過し、これらの実装をオーバーライドします。