Singleton在XCODE中不起作用

时间:2011-07-27 09:07:30

标签: iphone objective-c xcode cocoa-touch singleton

我正试图在我的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 个答案:

答案 0 :(得分:3)

以下代码片段直接来自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 :(得分:1)

关于单身人士的stackoverflow有一个完美的话题。我甚至不认为我应该自己提出任何其他建议。请检查一下:

What should my Objective-C singleton look like?

对你来说,这一定是绰绰有余的。祝你好运!

答案 2 :(得分:1)

也按照给定的here实现其余方法并尝试。

修改

你保留myToken字符串变量吗?

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

替换像这样的setAuth方法..