3

所以我刚刚从 xcode 4.2 切换到 4.3,现在我创建/使用单例的旧方法不起作用。所以我对如何设置单例进行了研究,我在这里有这段代码。

GlobalLogin.h

@interface GlobalLogin : UIViewController
+(GlobalLogin *)sharedInstance;
@end

GlobalLogin.m

@implementation GlobalLogin


#pragma mark -
#pragma mark Singleton Methods

+ (GlobalLogin*)sharedInstance {

static GlobalLogin * sharedInstance;
if(!sharedInstance) {
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        sharedInstance = [[super allocWithZone:nil] init];
    });
}

return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {    

return [self sharedInstance];
}


- (id)copyWithZone:(NSZone *)zone {
return self;    
}

#if (!__has_feature(objc_arc))

- (id)retain {  

return self;    
}

- (unsigned)retainCount {
return UINT_MAX;  //denotes an object that cannot be released
}

- (void)release {
//do nothing
}

- (id)autorelease {

return self;    
 }
#endif

#pragma mark -
#pragma mark Custom Methods

所以我一切都好,但我的问题是我无法在任何地方找到如何在需要使用它的各种视图控制器中访问它的信息。因此,如果有人能指出我正确的方向,那将不胜感激。

4

1 回答 1

2

我不知道你为什么要调用+[super alloc],它基本上应该已经被 alloc 本身调用了,但我认为你的意思是-[super init],它甚至本身应该已经被调用了 by -init。将初始化程序更改为读取

static GlobalLogin * sharedInstance;
if(!sharedInstance) {
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        sharedInstance = [[self alloc] init];
    });
}

然后覆盖-init并调用super:

-(id)init {
    self = [super init];
    if (self) {
       //initialization code here
    }
    return self;
}
于 2012-07-17T23:45:50.257 回答