Iphone 线程1:程序接收信号:“1”;EXC“不良访问”;

Iphone 线程1:程序接收信号:“1”;EXC“不良访问”;,iphone,objective-c,c,object,Iphone,Objective C,C,Object,我只有一个简单的代码来练习对象C。。 我不知道为什么我能听到这个“警告”? 我的代码在下面 #import <Foundation/Foundation.h> @interface MyClass : NSObject { @private NSDate *mdate; } @property (retain) NSDate *mdate; @end ============================================= #import "MyC

我只有一个简单的代码来练习对象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;
}
#导入
#导入“MyClass.h”
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
MyClass*mclass=[[MyClass alloc]init];
NSDate*我的生日;
NSDateFormatter*dateFormat=[[NSDateFormatter alloc]init];
[日期格式setDateFormat:@“yyyy/MM/dd”];
我的生日=[dateFormat dateFromString:@“1990/09/02”];
[McClass setMdate:我的生日];
NSLog(@“我的生日是%@”,[McClass mdate]);
//在这里插入代码。。。
NSLog(@“你好,世界!”);
[McClass释放];
//[日期格式发布];
[泳池排水沟];
返回0;
}
在[pool drain]>中,我在跑步后收到了消息

我真的是C对象的新手。有人能解释一下我错过了什么吗? 我想这会导致我的内存管理(?)
顺便说一句,我是为console写这篇文章的。

Mdate发布过度了


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

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

mdate = [[NSDate date] autorelease]; //Wrong statement.
MyClass
init函数中,您不应该调用
NSDate
对象上的
autorelease
,该对象不是您创建的,您从iOS框架中获得,iOS有责任释放它

以下是您的
mdate
对象过度扩展的情况

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

如果.h文件的定义如下,请阅读Apple

#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) {
        // 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

您不释放池对象,这是一个内存泄漏,尽管应用程序在它之后直接终止,但最好释放它,而不是耗尽它。释放它将为您排出它。实际上,
drain
会排出池中的水并释放它。至少这行代码是正确的。