Локальные переменные в вызове очереди отправки на iOS вызывают периодические сбои - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть приложение, которое выполняет некоторую фоновую обработку ... чтобы обновить индикатор выполнения, а не основной поток, я вызываю метод, используя:

dispatch_async(dispatch_get_main_queue(),^{
            [self updateProgress];
                   });

Я получаю EXEC_BAD_ACCESS в этой строке:

 int secs=[nowDate timeIntervalSinceDate:startTransmitDate];

Вот метод:

-(void)updateProgress
{
    [mainProgressBar setProgress:((float)dataOffset/(float)totalToSend)];
    NSDate *nowDate=[NSDate date];
    int secs=[nowDate timeIntervalSinceDate:startTransmitDate];
    if(secs>0){
        float bps=(float)dataOffset/(float)secs*(float)8.0;
        bps=bps/(float)1024.0; // k
        bps=bps/(float)1024.0; // M
        if(bpsLabelText){
            speedLabel.text=nil;
            [bpsLabelText release];
            bpsLabelText=nil;
        }
        bpsLabelText=[NSString stringWithFormat:@"%0.1fMb/s",bps];
        [bpsLabelText retain];
        speedLabel.text=bpsLabelText;
    }
}

StartTransmitDate объявлен в реализации класса ... и установлен в другом месте:

startTransmitDate=[NSDate date];
 [startTransmitDate retain];

Что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2011

Не могли бы вы пропустить объявление nowDate?

NSDate *nowDate = [NSDate date]
0 голосов
/ 02 декабря 2011

Вот странная идея.Попробуйте объявить все ваши локальные переменные экземпляра без инициализаторов в самом верху блока, а затем инициализировать их только после объявления всех переменных экземпляра.Если поведение меняется, возможно, вы обнаружили ошибку!

0 голосов
/ 27 ноября 2011

Как инициализируется startTransmitDate? Если он нигде не сохраняется, вы инициализировали его с помощью __block, чтобы сохранить его, пока блок не прекратит его использовать?

...