SIGABRT (нераспознанный селектор) после попытки записи NSData из NSURLConnection в файл - PullRequest
4 голосов
/ 09 июля 2011

РЕШЕНО: имя файла было автоматически выпущенной строкой, более недоступной при вызове на createFileAtPath:


Я пытаюсь отслеживать ход загрузкиФайл и код, который я пытаюсь реализовать, это (отредактировано) :

 connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];

    if (connection)
        receivedData = [[NSMutableData data] retain];    

    -(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData setLength:0];

    totalBytes = [[NSNumber numberWithLongLong:[response expectedContentLength]] intValue];
    NSLog(@"content-length: %i bytes", totalBytes);
}

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];

    int resourceLength = [[NSNumber numberWithUnsignedInteger:[receivedData length]] intValue];
    NSLog(@"receivedData length: %i", resourceLength);
}

-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
    [fileMgr createFileAtPath:filename contents:receivedData attributes:nil];

    //if instead i write only the Apple example:
    //NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
    //there's no SIGABRT
    [receivedData release];
    [connection release];
}

, но createFileAtPath: contents: attribute: просто дает SIGABRT:

- [__NSCFData getFileSystemRepresentation: maxLength:]: нераспознанный селектор отправлен в экземпляр 0x2ba510

* Завершение работы приложения из-за неисследованного исключения «NSInvalidArgumentException», причина: «- [__ NSCFDefense: get]: нераспознанный селектор отправлен на экземпляр 0x2ba510 '

что я делаю не так?Разве это не способ загрузить файл асинхронно?

Еще 2 вещи: a) NSLog длины содержимого верен.б) если я не initWithCapacity: content-lenght в didReceiveResponse и просто init, длина receiveData только увеличивается в два раза по сравнению с длиной содержимого ...

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

решено: имя файла было автоматически выпущенной строкой, более недоступной при вызове при createFileAtPath:

1 голос
/ 09 июля 2011

Я не могу сказать это лучше, чем в Apple Docs , поэтому я не буду пытаться. Следуйте этому руководству, и вы должны быть решены.

В качестве дополнительного примечания в вашем коде есть несколько проблем с памятью в этой строке

self.receivedData = [[NSMutableData alloc] initWithCapacity:[response expectedContentLength]];

Вы создаете NSMutableData объект с сохранением счетчика +1 и при условии, что у вас есть соответствующие геттеры / сеттеры, сделанные с использованием @property (nonatomic, retain) NSMutableData *recievedData, которые добавят дополнительно + 1.

Чтобы решить эту проблему, подойдет любая из этих двух (неавтоматическая версия лучше всего подходит для iphone).

NSMutableData *recievedData = [[NSMutableData alloc] initWithCapacity:[response expectedContentLength]]; 
self.recievedData = recievedData;
[recievedData release]; recievedData= nil;

// or the autoreleased version
self.recievedData = [NSMutableData dataWithCapacity:[response expectedContentLength]];

Дополнительно я бы позвонил

self.recievedData = nil;

вместо

[self.recievedData release];

Поскольку это кажется немного безопаснее, и вы используете сеттер, который является хорошей практикой, чтобы войти в него.

...