2011-06-11 127 views
0

我只是有一個簡單的代碼來練習對象C .. 我不知道爲什麼我可以這個「警告」? 我的代碼如下線程1:編程接收到的信號:「EXC_BAD_ACCESS」

#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] - >我跑了之後得到了消息。

對對象C我真的很新手。有人能解釋我錯過了什麼嗎? 我認爲這會導致我的內存管理(?) 順便說一句,我正在寫這個控制檯。

+0

你不釋放池對象,這是內存泄漏,儘管應用程序直接在它之後終止,但最好釋放它而不是d下雨吧。釋放它會爲你消耗。 – 2011-06-11 13:06:50

+0

事實上,'排水管'排出池並釋放它。該行代碼至少是正確的。 – bbum 2011-06-11 13:39:04

回答

5

Mdate已經過期。

一般來說,你的內存管理是完全錯誤的。閱讀「可可內存管理指南」,因爲它清楚地解釋了相對簡單的規則。

+1

+1並在構建設置中啓用「運行靜態分析器」。 – 2011-06-11 13:05:50

2

你不應該釋放你既不會被隔離或初始化的對象。

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

在你初始化MyClass功能,你不應該在NSDate對象,你不創建調用autorelease你從iOS的框架得到它和iOS自己有責任將其釋放。

以下是您的mdate對象過度放電的情況。

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

閱讀蘋果Memory Management Programming Guide

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 
相關問題