Реализация класса Singleton - PullRequest
0 голосов
/ 23 марта 2011

Я в основном использовал класс 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;
    }
}

когда я устанавливаю значение для totaltime в своем классе appDelegate и извлекаю его только в этом классе, я получаю правильное значение. но когда я получаю только значение в каком-то другом классе, я получаю ПЛОХОЕ ИЗДАНИЕ. я сначала создаю sharedinstance, а затем только вызываю этот метод, тогда почему я получаю эту ошибку ??

globalVar *myEngine = [globalVar sharedInstance];

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

в моем приложении делегат

globalVar *myEngine = [globalVar sharedInstance];

[myEngine setTotalTime:totalTime];

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

Ответы [ 2 ]

0 голосов
/ 23 марта 2011
0 голосов
/ 23 марта 2011

Вы освобождаете totalTime, но не сохраняете новое значение, что означает, что при обращении к нему оно уже было выпущено, что вызывает исключение неправильного доступа.

Вы можете исправить это, изменив строкуВы устанавливаете значение, чтобы включить вызов для сохранения:

totalTime = [[NSString stringWithFormat:@"%@",time] retain];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...