2011-03-23 75 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];