内存管理:EXC_BAD_ACCESS错误

时间:2012-03-07 09:06:31

标签: objective-c memory memory-management

好的,所以我一直收到一个EXC_BAD_ACCESS错误,我猜这个错误很像C中的seg错误错误。

我的书并没有真正详细说明其中一些细节,所以我需要一些帮助。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSDateComponents *comps = [[NSDateComponents alloc ]init];
    [comps setYear:1984];
    [comps setMonth:7];
    [comps setDay:18];
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];

    NSCalendar *g =[[NSCalendar alloc ]init];
    NSDate *dateofbirth = [g dateFromComponents:comps];
    NSDate *now = [NSDate date];

    double timeSince = [now timeIntervalSinceDate:dateofbirth ];


    NSLog(@"your age %@", timeSince);



    [pool drain];



    return 0;
}

我认为我遇到了麻烦,因为我正在初始化并在池中分配内存。这是对的吗?

1 个答案:

答案 0 :(得分:2)

NSLog字符串中的“%@”需要一个对象,但是你传入了一个double。尝试:

    NSLog(@"your age %lf", timeSince);

具体来说,“%@”尝试在参数上调用-message。由于你的参数是double,运行时最终会尝试将double视为指针,并取消引用它(导致你的EXC_BAD_ACCESS)。

就内存管理而言,您正在泄漏compsg。在程序结束时,添加:

[comps release];
[g release];

虽然这不会导致你的错误(也不会真正伤害任何东西,因为你正在退出并且操作系统正在回收内存。但是当你学习Objective-C时,不会在其他地方释放你的对象会导致泄漏)