iOS:Singleton中的属性值

时间:2014-03-31 12:57:36

标签: ios objective-c singleton

我的单身人士设置:

//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"?

3 个答案:

答案 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要在responseObjectprofileSharedInstance返回另一个实例。

您应该更新它包含的值,而不是更改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;