Ошибка EXC_BAD_ACCESS в Objective-C - PullRequest
       4

Ошибка EXC_BAD_ACCESS в Objective-C

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

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

В моей программе я пытаюсь получить время в секундах, преобразовать его в строку и затем преобразовать в объект NSData для записи в файл.Вот код, который я использую, но он вылетает с EXC_BAD_ACCESS каждый раз, когда я запускаю его.Что я делаю не так?

-(void) startTheClock{

    NSTimeInterval cloqInTime = [NSDate timeIntervalSinceReferenceDate];
    NSString * dateStr = [self stringFromTimeInterval:cloqInTime];

    NSData * data = [[dateStr stringByAppendingString:@", "] dataUsingEncoding:NSUTF8StringEncoding];
    NSLog([@"Data:" stringByAppendingString:[data description]]);


// [data retain]; // <-- Uncommenting this and the [data release] line doesn't prevent the error
   [self writeData:data]; // <-- EXC_BAD_ACCESS happens here!
// [data release];
}

Когда я запускаю этот метод, я получаю следующий вывод:

timeString: |2011-11-04 16:17:12|
Data:<32303131 2d31312d 30342031 363a3137 3a31322c 20>

В соответствии с запросом мой метод stringFromTimeInterval:

-(NSString *) stringFromTimeInterval:(NSTimeInterval)t{
    NSDate * date  = [NSDate dateWithTimeIntervalSinceReferenceDate:t];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSString *timeString = [dateFormat stringFromDate:date];

    NSLog(@"timeString: %@", timeString);    
    return timeString;
}

Вот трассировка стека:

#0  0x00007fff84407e90 in objc_msgSend ()
#1  0x00000001054543f0 in 0x00000001054543f0 ()
#2  0x00000001000012ee in -[WorqAppDelegate startTheClock] at /Users/slayton/Documents/Xcode/Worq/Worq/WorqAppDelegate.m:61
#3  0x0000000100001164 in -[WorqAppDelegate cloqInAction:] at /Users/slayton/Documents/Xcode/Worq/Worq/WorqAppDelegate.m:37
#4  0x00007fff8cbb9a1d in -[NSObject performSelector:withObject:] ()
#5  0x00007fff86f69710 in -[NSApplication sendAction:to:from:] ()
#6  0x00007fff86f69642 in -[NSControl sendAction:to:] ()
#7  0x00007fff86f6956d in -[NSCell _sendActionFrom:] ()
#8  0x00007fff86f68a30 in -[NSCell trackMouse:inRect:ofView:untilMouseUp:] ()
#9  0x00007fff86fe88e0 in -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] ()
#10 0x00007fff86f6763a in -[NSControl mouseDown:] ()
#11 0x00007fff86f320e0 in -[NSWindow sendEvent:] ()
#12 0x00007fff86eca68f in -[NSApplication sendEvent:] ()
#13 0x00007fff86e60682 in -[NSApplication run] ()
#14 0x00007fff870df80c in NSApplicationMain ()
#15 0x0000000100001092 in main ()

Вот метод writeData, recordFile - это экземпляр NSFileHandle:

-(BOOL) writeData:(NSData *)data{
    if (recordFile != NULL)
        [recordFile writeData:data];
    else
        NSLog(@"Record file is null! No data written");
}

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Следите за своим recordFile объектом. Мне интересно, был ли этот объект переиздан (и, следовательно, освобожден), но не является ли nil Это приведет к тому, что метод [recordFile writeData:data] сгенерирует EXC_BAD_ACCESS. Какова продолжительность жизни recordFile?

1 голос
/ 05 ноября 2011

Выходя на конечности, но я бы сказал, что data, вероятно, nil. Вы проверили значение data?

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

отладчик и, в частности, трассировка стека - ваш друг, но, скорее всего, данные равны nil.

в окне отладчика в командной строке введите: po data

или лучшепросто посмотрите на локальные переменные в левой панели и посмотрите, какое значение имеют данные.

...