NSURLConnection вопросы о сбоях - PullRequest
0 голосов
/ 09 апреля 2009

Я использую NSURLConnection, как указано ниже. У меня есть три вопроса об этом классе. Когда я объединяю значение 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, запрос будет обработан, и значение [длина полученной информации] будет около 1600, когда

    - (void)connectionDidFinishLoading:(NSURLConnection   *)connection

получает удар. Есть ли способ точно проверить, есть ли в dataData реальные данные, которые вы запрашиваете. Целевой файл составляет около 7 МБ, но может варьироваться от 1,5 МБ до 9 МБ. Запрошенного мною ресурса там не было, но что-нибудь указывает на это?

3.) Я делаю это в моем делегате приложения. Единственный протокол - UIApplicationDelegate. Как работают все методы NSURLConnection, если для них нет делегата?

1 Ответ

4 голосов
/ 09 апреля 2009

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

Разница в том, что один из них позволяет вам выпустить то, что вам не принадлежит, а другое нет.

Вы не распределили его, не скопировали и не сохранили, поэтому не владеете им, поэтому не выпускайте его.

В качестве подробностей реализации строковые литералы не реализуют подсчет ссылок. Строковые литеральные объекты будут игнорировать вас, когда вы попытаетесь сохранить или освободить их. Вот почему версия, в которой вы выпускаете строковый литерал, не аварийно завершает работу, а версия, в которой вы создаете новую строку и освобождающий ее выпуск. Но это деталь реализации - ни на что не полагайтесь. Всегда предполагайте, что освобождение чего-то, что вам не принадлежит, приведет к сбою.

Есть ли способ точно проверить, есть ли в dataData реальные данные, которые вы запрашиваете.

В отличие от сообщения об ошибке? Проверьте код ответа.

В отличие от некоторых других данных? Вы можете использовать хеши, хотя как вы определите правильный хеш, будет зависеть от вас. Однако, вероятно, проще просто поверить, что сервер не выдаст вам неправильный файл.

Запрошенного мною ресурса не было, но что-нибудь указывает на это?

Да. Реализуйте connection:didReceiveResponse: и проверьте код ответа.

Обратите внимание, что если сервер использует mod_speling или что-то подобное, он может исправить ваш URL-адрес вместо возврата ошибки - например, изменив запрошенный вами «afile.mp» на «afile.mp4», который действительно существует .

3.) Я делаю это в моем делегате приложения. Единственный протокол - UIApplicationDelegate. Как работают все методы NSURLConnection, если для них нет делегата?

Вы сказали delegate:self, значит, вы являетесь делегатом соединения.

На Mac, по крайней мере, NSURLConnection разделяет методы на NSObject, поэтому они всегда доступны, по крайней мере, в неактивной форме. Вы переопределяете эти реализации, поэтому, когда NSURLConnection отправляет делегату вашего соединения (вам) эти сообщения, они переходят к предоставленным вами реализациям.

...