получение EXC_BAD_ACCESS при назначении строки NSString - PullRequest
1 голос
/ 02 марта 2011

Я написал функцию для возврата строки в путь к каталогу. Я получаю EXC_BAD_ACCESS, и я думаю, что эта функция является причиной.Нужно ли сохранять строку или что-то в этом роде?

-(void) getRemoteFiles:(NSMutableArray *) M
{
    [self createFileToAppDirectory];

    if (!networkqueue) {
        networkqueue:[[[ASINetworkQueue alloc] init] autorelease];
    }

    [[self networkQueue] cancelAllOperations];

    [self setNetworkQueue:[ASINetworkQueue queue]];
    [[self networkQueue] setDelegate:self];
    [[self networkQueue] setRequestDidFinishSelector:@selector(requestFinished:)];
    [[self networkQueue] setRequestDidFailSelector:@selector(requestFailed:)];
    [[self networkQueue] setQueueDidFinishSelector:@selector(queueFinished:)];


    int i;

    for (i=0; i<[M count]; i++) {
        NSString *url=[M objectAtIndex:i];
        NSString* theFileName = [url lastPathComponent];
        NSString *safestring=[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        if ([theFileName isEqualToString:@"nothing"]==NO) {

            ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:safestring]];
            //think this is causing the problem
            NSString *savepath=[self getDirectoryPathForFileName:theFileName];
            //[request setDownloadDestinationPath:savepath];
            [[self networkQueue] addOperation:request];
        }

    }

    [[self networkQueue] go];
    //error thrown after this point


}
-(NSString *)getDirectoryPathForFileName:(NSString *)filename

{
    NSFileManager *filemgr;
    NSArray *dirPaths;
    NSString *docsDir;
    NSString *newDir;
    BOOL isDir;


    filemgr =[NSFileManager defaultManager];
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    docsDir = [dirPaths objectAtIndex:0];

    newDir = [docsDir stringByAppendingPathComponent:@"remix_data"];
    if ([filemgr fileExistsAtPath:newDir isDirectory:&isDir]==NO) {
        NSLog(@"dir should exist but does not... go funt dat");
    }

    NSString *localFilePath = [newDir stringByAppendingPathComponent:filename];
    [filemgr release];
    [docsDir release];
    [newDir release];
    return localFilePath;
}

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Нет, вы на самом деле переиздание. В getDirectoryPathForFileName вы выпускаете docsDir (например), хотя вы никогда не сохраняли его. Вы вытаскивали его из массива dirPaths, который не увеличит количество сохраняемых данных. Выпуская его, вы уменьшаете количество сохранений, возможно, до нуля, что освобождает строку, пока массив все еще думает, что она ее удерживает. В следующий раз, когда массив будет что-то делать с этой строкой, ваше приложение потерпит крах. Просто удалите вызовы релиза для docsDir и newDir, и все будет хорошо ...

1 голос
/ 02 марта 2011

Как всегда, когда у кого-то возникает проблема EXC_BAD_ACCESS, я рекомендую NSZombie. В вашем конкретном случае довольно легко понять, почему он рушится, поскольку вы выпускаете материал без предварительного выделения или сохранения его. Вы должны выпускать только те материалы, которые вы выделили или сохранили сами.

В случае, если в будущем у вас возникнет проблема EXC_BAD_ACCESS, это не так просто выяснить, вот как использовать NSZombie:

Чтобы активировать NSZombie, выполните следующие действия:

  1. Получить информацию об исполняемом файле.
  2. Перейти на вкладку аргументов.
  3. В разделе «Переменные, которые должны быть установлены в среде:» добавить:

Имя: NSZombieEnabled Значение: ДА

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

0 голосов
/ 02 марта 2011

Да, лучше сохранить строку и освободить ее после использования. Кроме того, освобождение строк docsDir и newDir не рекомендуется, поскольку вы не выделяете их. Это объекты автоматического освобождения.

...