2011-03-23 4 views
0

J'utilise la plupart du temps la classe appDelegate pour les variables globales, mais récemment, je suis venu pour savoir que ce ne est pas une façon GUD pour garder les variables globales, donc je suis en train de faire une classe singleton comme suitImlementation de Singleton classe

@implementation globalVar 


static globalVar *_sharedInstance =nil; 

@synthesize totalTime; 
- (id) init 
{ 
    if (self = [super init]) 
    { 


    } 
return self; 
} 

+ (globalVar *) sharedInstance 
{ 
    @synchronized (self) { 
     if (_sharedInstance == nil) { 
      [[self alloc] init]; 
     } 
    } 

    return _sharedInstance; 
} 
+ (id)allocWithZone:(NSZone *)zone { 
    @synchronized(self) { 
     if (_sharedInstance == nil) { 
      _sharedInstance = [super allocWithZone:zone]; 
      return _sharedInstance; 
     } 
    } 
    return nil; 
} 
- (id)copyWithZone:(NSZone *)zone 
{ 
    return self; 
} 
-(NSUInteger)retainCount 
{ 
    return NSUIntegerMax; //denotes an object that cannot be released 
} 
- (void)release 
{ 
    // do nothing 
} 

- (id)autorelease 

{ 
    return self; 
} 


- (void) setTotalTime:(NSString *)time 
{ 

    @synchronized(self) { 
     if (totalTime != time) { 
      [totalTime release]; 
      totalTime = [NSString stringWithFormat:@"%@",time]; 
     } 
    } 

    //NSLog(@"time %@",totalTime); 
} 
-(NSString *)getTotalTime 
{ 
    @synchronized(self) { 
     //NSLog(@"total %@",totalTime); 
     return totalTime; 
    } 
} 

Lorsque je définis la valeur de totaltime dans ma classe appDelegate et que je la récupère dans cette classe uniquement, j'obtiens la valeur correcte. mais quand je récupère seulement la valeur dans une autre classe je reçois BAD EXCESS. Je crée d'abord l'instance shared et alors seulement appelez cette méthode alors pourquoi suis-je obtenir cette erreur ??

globalVar *myEngine = [globalVar sharedInstance]; 

NSLog(@"about %@",[myEngine totalTime]); 

dans mon délégué app

globalVar *myEngine = [globalVar sharedInstance]; 

[myEngine setTotalTime:totalTime]; 

NSLog(@"in app delegate%@",[myEngine getTotalTime]); 

Répondre

0

Vous êtes libérant totalTime mais ne retenant pas la nouvelle valeur, ce qui signifie que lorsque vous y accédez, il a déjà été libéré, ce qui provoque une mauvaise exception d'accès.

Vous pouvez corriger cela en changeant la ligne où vous définissez la valeur à inclure un appel à retenir:

totalTime = [[NSString stringWithFormat:@"%@",time] retain];