Iphone 单身汉不';不能在XCODE中工作

Iphone 单身汉不';不能在XCODE中工作,iphone,objective-c,xcode,cocoa-touch,singleton,Iphone,Objective C,Xcode,Cocoa Touch,Singleton,我正在尝试在我的iPhone应用程序中运行singleton 当我尝试实现并从第一个类向singleton的类请求它时,它正在运行,但之后,当我尝试从另一个类使用它时,它不起作用 这是第一节课和第二节课对单身者的呼吁: NSLog([ [MySingleton sharedMySingleton] getAuth]); 她是独生子女的班级: #import "MySingleton.h" @implementation MySingleton static MySingleton* _sh

我正在尝试在我的iPhone应用程序中运行singleton

当我尝试实现并从第一个类向singleton的类请求它时,它正在运行,但之后,当我尝试从另一个类使用它时,它不起作用

这是第一节课和第二节课对单身者的呼吁:

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
我在第二个类中正确导入了singleton类;-)

就这样


感谢您的帮助:-D

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


这对你来说一定足够了。祝你好运

关于单例的stackoverflow有一个完美的主题。我甚至不认为我应该自己提出任何其他建议。只要检查一下:


这对你来说一定足够了。祝你好运

也按照给定的方法执行其余的方法并尝试

编辑:


您是否保留myToken字符串变量

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

像这样替换setAuth方法。

也按照给定的方式执行其余方法,然后重试

编辑:


您是否保留myToken字符串变量

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

像这样替换setAuth方法。

以下代码片段直接来自一位苹果工程师,目前被认为(内部)是实现单例的最佳和最有效的方法(因为它充分利用了GCD)

上述工程师关于上述内容的报价

简短、甜蜜,以及任何在当前架构上合法的东西都可能被用于实现,这意味着您永远不必担心在当前内存模型中什么是合法的或不合法的


它还可以让您摆脱其他过时实现所需的所有样板代码。

以下代码片段直接来自一位苹果工程师,目前被视为(内部)实现单例的最佳和最有效方式(因为它充分利用了GCD)

上述工程师关于上述内容的报价

简短、甜蜜,以及任何在当前架构上合法的东西都可能被用于实现,这意味着您永远不必担心在当前内存模型中什么是合法的或不合法的


它还允许您删除其他过时实现所需的所有样板代码。

谢谢Gomathi,我实现了它,但它仍然不起作用(代码已更新)。您是否保留myToken字符串变量?我已经编辑了我的帖子。很好!虽然您可能希望
复制
而不是
保留
-请查看此答案以了解原因(并且您将首先检查
myToken!=token
,以防您意外解除锁定您试图保留的对象)。感谢Gomathi,我实现了它,但它仍然不起作用(代码更新)您是否保留myToken字符串变量?我已经编辑了我的帖子。很好!虽然你可能想
复制
而不是
保留
-请看下面的答案,了解原因(如果你不小心解除锁定了你试图保留的对象,你首先要检查
myToken!=token
),什么意思是它不起作用-什么不起作用?@dean:MySingleton*MySingleton=[mySingleton sharedManager];使程序崩溃,并在调试器控制台中不显示任何内容…什么是它不工作-什么不工作?@dean:mySingleton*mySingleton=[mySingleton sharedManager];使程序崩溃并在调试器控制台中不显示任何内容…+1不要对自己使用十几种方法编写一个单例代码进行防御。这里解释了此实现:@jano我不确定此评论是否针对我,但我不是在防御,而是提供了一个利用现代技术的替代解决方案GIE,比如GCD。我并不反对用十几种方法来编写一个单例代码,我只是不明白为什么只有一种方法就足够了。很抱歉不是这样,我同意你的看法,我只是评论了一下,因为这应该是默认的实现,除非你有不同的理由这样做。+1不要对自己编写单例代码感到防备n有十几种方法。这里解释了这个实现:@jano我不确定这个评论是否是针对我的,但我不是出于防御,而是提供了一个利用现代技术(如GCD)的替代解决方案。我并不反对用十几种方法编写单例代码,我只是不明白为什么在单方法就足够了。很抱歉不是这样,我同意你的意见,我只是评论了一下,因为这应该是默认的实现,除非你有理由改变它。