我正试图在我的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
答案 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方法..