Синглтон не работает в XCODE - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь запустить синглтон в своем приложении для iPhone '.

Когда я пытаюсь реализовать его и запросить его от первого класса к классу синглтона, он запускается, но после, когда я пытаюсьиспользовать его из другого класса, он не работает ...

Вот вызов синглтона в первом и втором классах:

NSLog([ [MySingleton sharedMySingleton] getAuth]);

Ее класс синглтона:

#import "MySingleton.h"

@implementation MySingleton

static MySingleton* _sharedMySingleton = nil;
@synthesize myToken;

+(MySingleton*)sharedMySingleton
{
    @synchronized([MySingleton class])
    {
        if (!_sharedMySingleton)
            [[self alloc] init];
        return _sharedMySingleton;
    }
    return nil;
}

+(id)alloc
{
    @synchronized([MySingleton class])
    {
        NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton.");
        _sharedMySingleton = [super alloc];
        return _sharedMySingleton;
    }

    return nil;
}

-(id)init {
    self = [super init];
    if (self != nil) {
        myToken = [[NSString alloc] initWithString:@""];
    }

    return self;
}

-(void)setAuth:(NSString*) token {
    myToken=token;
}


-(NSString*)getAuth {
    return myToken;
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}
- (id)retain {
    return self;
}
- (unsigned)retainCount {
    return UINT_MAX; //denotes an object that cannot be released
}
- (void)release {
    // never release
}
- (id)autorelease {
    return self;
}
- (void)dealloc {
    // Should never be called, but just here for clarity really.
    [myToken release];
    [super dealloc];
}


@end

Я правильно импортировал класс синглтона во второй класс; -)

Вот и все!

спасибо за вашу помощь: -D

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Следующий фрагмент предоставлен непосредственно инженером Apple и в настоящее время рассматривается ( внутри компании ) как лучший и наиболее эффективный способ реализации синглтона (, поскольку он в полной мере использует GCD ) ...

+(id)sharedInstance
{
    static dispatch_once_t pred = 0;
    static id object = nil;
    dispatch_once(&pred, ^{ object = /* object initialization goes here */ });
    return object;
}

Цитата из упомянутого инженера относительно вышеупомянутого ...

Короткое, приятное и все, что считается законным в текущей архитектуре, вероятно, было использовано для реализации, что означает, что вам никогда не придется беспокоиться о том, что является или не является законным в вашей текущей модели памяти.

Это также позволяет избавиться от всего стандартного кода, необходимого для других устаревших реализаций.

1 голос
/ 27 июля 2011

Реализуйте остальные методы также, как указано здесь и попробуйте.

Редактировать:

Сохраняете ли вы строковую переменную myToken?

-(void)setAuth:(NSString*) token {
    if( token != myToken )
    {
       [myToken release];
       myToken=[token copy];
    }
}

Замените метод setAuth следующим образом ..

1 голос
/ 27 июля 2011

На стеке есть идеальная тема о синглетонах.Я даже не думаю, что я должен делать какие-либо другие предложения от себя.Просто проверьте это:

Как должен выглядеть мой синглтон Objective C?

Это должно быть действительно более чем достаточно для вас.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...