首先,我想说我在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 ??
请帮助,我花了两天时间试图解决这个问题。
亲切的问候。
答案 0 :(得分:0)
我找到了答案。
正如KerrM建议我的用户类中的属性未正确声明。
他们应该坚强并保留,但他们是弱的和非原子的。
感谢您的帮助。
答案 1 :(得分:0)
您每次拨打sharedCacheobject
时都会重置[cacheobject sharedCacheobject]
,但您只是初始化一次。因此,您第一次将对象设置为nil并然后在dispatch_once
块中初始化它。在此之后,您将sharedCacheobject
设置为nil
,但由于onceToken
已被使用,因此永远不会重新初始化。
如果您在同一视图中调用它两次,它仍然应该返回nil
,那么第二次调用sharedCacheobject
时会发生另一种视图。
尝试更改
static cacheobject *sharedMyManager = nil;
到
static cacheobject *sharedMyManager;