繁体   English   中英

Objective-C中的EXC_BAD_ACCESS错误

[英]EXC_BAD_ACCESS error in Objective-C

EXC_BAD_ACCESS会得到一个似乎困扰新的Objective-C程序员的EXC_BAD_ACCESS错误。

在我的程序中,我试图以秒为单位获取时间,将其转换为字符串,然后将其转换为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方法, recordFileNSFileHandle一个实例:

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

走出困境,但我会说data可能是nil 你检查过data的价值了吗?

密切关注您的recordFile对象。 我想知道这个对象是否已被过度释放(并因此被解除分配)但不是nil 这将导致[recordFile writeData:data]方法抛出EXC_BAD_ACCESS。 recordFile的生命周期是recordFile

调试器,特别是堆栈跟踪是你的朋友,但是,很可能数据是零。

在提示符的调试器窗口中,键入:po data

或者更好,只需查看左窗格中的局部变量,查看数据的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM