2013-08-21 3 views
1

У меня есть эти методы, которые обрабатывают загрузкуNSMutableData initWithCapacity абсурдная емкость?

Но есть ошибка при инициализации NSMutableData

NSNumber *filesize; 
NSMutableData *data; 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    filesize = [NSNumber numberWithUnsignedInteger:[response expectedContentLength]]; 

} 

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)recievedData { 


    if (data==nil) { 
     data = [[NSMutableData alloc] initWithCapacity:[filesize floatValue]]; 
    } 


    [data appendData:recievedData]; 
    NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[data length]]; //MAGIC 
    float progress = [resourceLength floatValue]/[filesize floatValue]; 
    progressBar.progress = progress; 



} 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error " 
                 message:@" " delegate:self cancelButtonTitle: @"OK" 
               otherButtonTitles:nil]; 
    [alertView show]; 

    connection1=nil; 
    [connection1 cancel]; 



} 

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection { 

} 

Здесь генерирует ошибку

данные = [[NSMutableData Alloc] initWithCapacity: [размер файла floatValue] ];

[NSConcreteMutableData initWithCapacity]: абсурдная мощность: 4294967295, максимальный размер: 2147483648 байт

+0

Не должно быть 'initWithCapacity: [filesize unsignedIntValue]'? –

+0

Я пытаюсь, но я по-прежнему отмечал ту же ошибку. Что я могу сделать? – Fabio

+0

См. Подробный ответ @ Codo. –

ответ

2

Если NSURLResponse expectedContentLength не знает длину, он возвращает -1 (документация говорит NSURLResponseUnknownLength, который является константой, инициализированной -1).

Вы затем использовать забавный способ, чтобы перейти от long long (результат типа NSURLResponse expectedContentLength) через NSNumber numberWithUnsignedInteger и NSNumber floatValue к NSUInteger (аргумент NSMutableData initWithCapacity:). В результате -1 (внутренне представленный как 0xffffffff) заканчивается как 4294967295 (внутренне представлен как 0xffffffff).

Вы должны проверить для NSURLResponseUnknownLength и использовать в этом случае другую начальную емкость. И не используйте NSNumber. Просто преобразуйте подписанный long long в неподписанный NSUInteger, если он находится в разумном диапазоне.

Смежные вопросы