我的单身人士设置:
//UserProfile.h
@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * lastName;
+(UserProfile *)sharedInstance;
//UserProfile.m
+(UserProfile *)sharedInstance
{
static UserProfile *instance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
if (instance == nil){
instance = [[UserProfile alloc]init];
}
});
return instance;
}
致电Singleton:
UserProfile *profileSharedInstance = [Profile sharedInstance];
profileSharedInstance = [responseObject firstObject];
NSLog (@"[UserProfile sharedInstance].lastName %@", [UserProfile sharedInstance].lastName);
NSLog (@"profileSharedInstance.lastName %@", profileSharedInstance.lastName);
日志:
2014-03-31 05:47:50.557 App[80656:60b] [UserProfile sharedInstance].lastName (null)
2014-03-31 05:47:50.557 App[80656:60b] profileSharedInstance.lastName Smith
问题:为什么[UserProfile sharedInstance].lastName
为空?它不应该是" Smith
"?
答案 0 :(得分:2)
您的代码没有意义。
UserProfile *profileSharedInstance = [Profile sharedInstance];
profileSharedInstance = [responseObject firstObject];
这里你的init正在创建一个单例对象的静态引用。然后,您将通过引用从网络获得的内容来覆盖它。
在此之后对[UserProfile sharedInstance]
的任何调用都不起作用,因为静态引用现在已经消失。
您需要做的是创建一个接收对象并设置其值的方法。 e.g。
[[UserProfile sharedInstance] setProfile: <profileObject>];
当你创建一个单例时,你正在做的是要求类为你保留一个指向对象的指针,因为这个对象将在多个地方引用,有点像全局变量。与全局变量不同,您不能简单地用其他东西替换对象。您必须在init之后使用getter / setter来获取/更改值。
答案 1 :(得分:1)
问题:为什么[UserProfile sharedInstance] .lastName null?不应该是#34; Smith&#34;?
因为它从未被设置为任何东西。
此:
UserProfile *profileSharedInstance = [Profile sharedInstance];
profileSharedInstance = [responseObject firstObject];
获取对单例的引用,然后用新对象替换该引用。所以,你真的没有单例实例(你alloc init
要在responseObject
中profileSharedInstance
返回另一个实例。
您应该更新它包含的值,而不是更改UserProfile *profileSharedInstance = [Profile sharedInstance];
profileSharedInstance.lastName = [responseObject firstObject].lastName;
指向的对象。类似的东西:
{{1}}
(这不是理想的,也不是有效的,但应该有效)
答案 2 :(得分:1)
这一行
UserProfile *profileSharedInstance = [Profile sharedInstance];
设置您的局部变量并将其指向单例
这一行
profileSharedInstance = [responseObject firstObject];
将局部变量重新定位到[responseObject firstObject]
我认为你想要的是
UserProfile *profileSharedInstance = [Profile sharedInstance];
UserProfile *responseProfile = [responseObject firstObject];
profileSharedInstance.firstName=responseProfile.firstName;
profileSharedInstance.lastName=responseProfile.lastName;