Objective-C Singleton中的对象变为null

时间:2014-11-21 11:01:22

标签: objective-c properties null singleton

首先,我想说我在Objective-C上都很新,并在stackoverflow上发布。

我在标签栏应用程序中使用单例,该应用程序还从位于Web服务器上的API读取数据。

我的问题是,当我第一次实例化我的单例时,它可以工作,但是一旦我通过单击标签栏来改变视图,就会发生一些奇怪的事情。我的单例中的My User对象仍然存在,但其所有属性都设置为null。

我的单身人士以下列方式实施:

@implementation cacheobject

@synthesize location;
@synthesize currentUser;
@synthesize login;
@synthesize email2;
@synthesize isExistingUser;

+ (id)sharedCacheobject {

    static cacheobject *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}


- (id)init {
    if (self = [super init]) {
        self.location = 1;

    }
    return self;
}

- (void)dealloc {
    NSLog(@"DEALLOC!!!!!!!!");


}


@end

我以下列方式使用单身:

cacheobject *co = [cacheobject sharedCacheobject];
NSString *first = co.currentUser.firstname;
firstname2.text = first;

无论哪个视图是我的标签栏中的第一个视图,单例都能正常工作,但只要我导航到另一个视图,我的属性就为空。除了location属性,一切都是null。

我已记录用户对象,在两个视图中,对象都显示为:

<User: 0x8da1640>

由于十六进制值与我的猜测相同,它是同一个对象,但属性只是null ??

请帮助,我花了两天时间试图解决这个问题。

亲切的问候。

2 个答案:

答案 0 :(得分:0)

我找到了答案。

正如KerrM建议我的用户类中的属性未正确声明。

他们应该坚强并保留,但他们是弱的和非原子的。

感谢您的帮助。

答案 1 :(得分:0)

您每次拨打sharedCacheobject时都会重置[cacheobject sharedCacheobject],但您只是初始化一次。因此,您第一次将对象设置为nil并然后dispatch_once块中初始化它。在此之后,您将sharedCacheobject设置为nil,但由于onceToken已被使用,因此永远不会重新初始化。

如果您在同一视图中调用它两次,它仍然应该返回nil,那么第二次调用sharedCacheobject时会发生另一种视图。

尝试更改

static cacheobject *sharedMyManager = nil;

static cacheobject *sharedMyManager;