线程1:程序接收到的信号:“ EXC_BAD_ACCESS”

问题描述

|| 我只有一个简单的代码来练习对象C。 我不确定为什么可以使用此“警告”吗? 我的代码如下
#import <Foundation/Foundation.h>


@interface MyClass : NSObject {
@private
    NSDate *mdate;
}

@property (retain) NSDate *mdate;

@end
=================================
#import \"MyClass.h\"


@implementation MyClass

@synthesize mdate;

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
        mdate = [[NSDate date] autorelease];
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
}

@end
============================================
#import <Foundation/Foundation.h>
#import \"MyClass.h\"

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

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyClass *mclass = [[MyClass alloc]init];
    NSDate *myBirthday;
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
    [dateFormat setDateFormat:@\"yyyy/MM/dd\"];
    myBirthday=[dateFormat dateFromString:@\"1990/09/02\"];

    [mclass setMdate:myBirthday];
    NSLog(@\"My Birthday is %@\",[mclass mdate]);
    // insert code here...
    NSLog(@\"Hello,World!\");

    [mclass release];
    //[dateFormat release];

    [pool drain];
    return 0;
}
然后在[池排水]->我跑完后收到消息。 我真的是Object C的新手。有人可以解释一下我错过的内容吗? 我认为这导致我的内存管理(?) 顺便说一句,我是为控制台编写的。     

解决方法

        Mdate已发布。 通常,您的内存管理是完全错误的。阅读“可可内存管理指南”,因为它清楚地解释了相对简单的规则。     ,        您不应释放您未分配或初始化的对象。
mdate = [[NSDate date] autorelease]; //Wrong statement.
MyClass
的init函数中,不应在未创建的
NSDate
对象上调用
autorelease
,而是从iOS框架获取它,并且iOS负有释放它的责任。 这是您的“ 7”对象被过度释放的情况。
mdate = [NSDate date]; //Correct statement.
阅读《 Apple内存管理编程指南》     ,        如果您的.h文件是这样定义的:
#import <Foundation/Foundation.h>

@interface MyClass : NSObject {
@private
    NSDate *mdate;
}

@property (retain) NSDate *mdate;

@end
然后,您的.m文件应如下所示:
#import \"MyClass.h\"

@implementation MyClass

@synthesize mdate;

- (id)init
{
    self = [super init];
    if (self) {
        // mdate = [[NSDate date] autorelease];  WRONG
        // mdate = [NSDate date];  WRONG

        mdate = [[NSDate date] retain];  CORRECT
        // mdate = [[NSDate alloc] init];  CORRECT
        // mdate = [[[[NSDate alloc] init] autorelease] retain]; CORRECT (but weird)

        // self.mdate = [NSDate date];  CORRECT

    }
    return self;
}

- (void)dealloc
{
    [mdate release]; // NECESSARY
    [super dealloc];
}

@end