簡體   English   中英

線程 1:程序接收信號:“EXC_BAD_ACCESS”

[英]Thread 1: Program received signal: “EXC_BAD_ACCESS”

我只有一個簡單的代碼來練習 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;
}

在 [pool drain] -> 我跑完后收到了消息。

我真的是 Object C 的新手。 有人可以解釋我錯過了什么嗎? 我認為這會導致我的 memory 管理(?)順便說一句,我是為控制台寫的。

Mdate 已過釋放。

一般來說,你的 memory 管理是相當錯誤的。 閱讀《Cocoa memory 管理指南》,其中比較簡單的規則解釋清楚。

你不應該釋放你既不分配也不初始化的 object。

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

In your init function of MyClass , you should not call autorelease on the NSDate object, which you don't create, you get it from iOS framework and iOS own the responsibility to release it.

這是您的mdate object overreleased的情況。

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

閱讀 Apple Memory 管理編程指南

如果 your.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM