Singleton类的实现

时间:2011-03-23 12:34:21

标签: iphone ios singleton

我一直在使用appDelegate类来处理全局变量,但最近我才知道它不是一种保留全局变量的方法,所以我试图将一个单例类作为跟随

@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;
    }
}

当我在appDelegate类中设置totaltime的值并在该类中检索它时,我只得到正确的值。但是当我只检索其他类中的值时,我得到了BAD EXCESS。我首先创建sharedinstance然后只调用此方法然后为什么我会收到此错误?

globalVar *myEngine = [globalVar sharedInstance];

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

在我的app delegate

globalVar *myEngine = [globalVar sharedInstance];

[myEngine setTotalTime:totalTime];

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

2 个答案:

答案 0 :(得分:0)

您正在发布totalTime但未保留新值,这意味着当您访问它时,它已经被释放,导致访问异常。

您可以通过更改设置值的行来更正此项,以包含要保留的调用:

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

答案 1 :(得分:0)