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

时间:2011-06-11 12:47:57

标签: iphone objective-c c object

我只有一个简单的代码来练习对象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;
}

和[池排水] - &gt;我跑完后收到了消息。

我是对象C的新手。有人可以解释一下我错过了什么吗? 我认为这会导致我的记忆管理(?) 顺便说一句,我是在为控制台写这个。

3 个答案:

答案 0 :(得分:5)

Mdate过度释放。

一般来说,你的内存管理是非常错误的。阅读“可可内存管理指南”,因为它清楚地解释了相对简单的规则。

答案 1 :(得分:2)

你不应该释放既不是由你分配的也不是你初始化的对象。

mdate = [[NSDate date] autorelease]; //Wrong statement.

MyClass初始化功能中,您不应在autorelease对象上调用NSDate不要创建,< / strong>你从iOS框架获得它,iOS有责任发布它。

以下是mdate对象过度发布的情况。

mdate = [NSDate date]; //Correct statement.

阅读Apple Memory Management Programming Guide

答案 2 :(得分:0)

如果您的.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