2011-06-11 8 views
0

J'ai juste un code simple pour pratiquer l'objet C .. Je ne suis pas sûr pourquoi je peux cet "AVERTISSEMENT"? Mon code est ci-dessousFil 1: Programme reçu le signal: "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; 
} 

et dans [drain de la piscine] -> j'ai reçu le message après avoir couru.

Je suis vraiment novice sur l'objet C. Quelqu'un pourrait-il expliquer ce que j'ai manqué? Je pense que cela cause ma gestion de la mémoire (?) btw, j'écrivais cela pour la console.

+0

Vous n ne libère pas l'objet pool, qui est une fuite de mémoire, bien que l'application se termine directement après, il est préférable de le libérer au lieu de d il pleut. Le relâcher le drainera pour vous. –

+0

En fait, 'drain' draine la piscine et la libère. Cette ligne de code, au moins, est correcte. – bbum

Répondre

5

Mdate est trop libéré.

En général, votre gestion de la mémoire est tout à fait fausse. Lisez le "Guide de gestion de la mémoire de Cocoa" car il explique clairement les règles relativement simples.

+1

+1 et activer "Run Static Analyzer" dans les paramètres de construction. –

2

vous ne devriez pas libérer l'objet qui n'est ni alloué ni init par vous.

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

Dans votre fonction init de MyClass, vous ne devriez pas appeler autorelease sur l'objet NSDate, que vous ne créez pas, vous obtenez de cadre iOS et iOS possédez la responsabilité de le libérer.

Voici le cas de votre mdate objet surchargé.

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

Lire l'Apple Memory Management Programming Guide

0

Si votre fichier .h est défini comme ceci:

#import <Foundation/Foundation.h> 

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

@property (retain) NSDate *mdate; 

@end 

Ensuite, votre fichier .m devrait ressembler à ceci:

#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 
Questions connexes