2011-03-23 129 views
0

我一直在使用大多被用于全局变量,但最近的appDelegate类我才知道,它不是保持全局变量,所以我试图让一个单独的类如下辛格尔顿Imlementation类

@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; 
    } 
} 
一个GUD方式

当我在我的appDelegate类中设置totaltime的值并在该类中检索它时,我只能得到正确的值。但是当我只在其他一些类中检索到值时,我得到了错误的过度。我首先创建共享实例,然后只调用这个方法,那么为什么我得到这个错误?

globalVar *myEngine = [globalVar sharedInstance]; 

NSLog(@"about %@",[myEngine totalTime]); 
在我的应用程序委托

globalVar *myEngine = [globalVar sharedInstance]; 

[myEngine setTotalTime:totalTime]; 

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

回答

0

你释放totalTime但不保留新值,这意味着,当你访问它,它已经被释放,造成了恶劣的访问异常。

你可以通过改变你设置值的行纠正这包括呼叫保留:

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