2014-03-31 62 views
-1

我單身的設置:的iOS:屬性值在辛格爾頓

//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; 
} 

調用辛格爾頓:

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」?

+2

你設置'profileSharedInstance = [responseObject firstObject]',什麼是responseObject? – bsarr007

回答

1

問題:爲什麼[用戶配置sharedInstance] .lastName空?它不應該也是「史密斯」嗎?

因爲它從來沒有被設置成任何東西。

此:

UserProfile *profileSharedInstance = [Profile sharedInstance]; 
profileSharedInstance = [responseObject firstObject]; 

獲得對單的參考,然後替換爲新對象引用。所以,你真的沒有一個單一實例(你是alloc init荷蘭國際集團的另一個實例中responseObject返回)。

而是改變那profileSharedInstance點,你應該更新,它包含的值的對象。喜歡的東西:

UserProfile *profileSharedInstance = [Profile sharedInstance]; 
profileSharedInstance.lastName = [responseObject firstObject].lastName; 

(這是不理想,或有效率,但它應該工作)

+0

我可以做[UserProfile sharedInstance] =(UserProfile *)[responseObject firstObject]; – user1107173

+0

如何將sharedInstance分配給我從RESTkit獲得的responseObject。 – user1107173

+0

你沒有。您將值分配給單身... – Wain

2

您的代碼是沒有意義的。

UserProfile *profileSharedInstance = [Profile sharedInstance]; 
profileSharedInstance = [responseObject firstObject]; 

在這裏你的init正在創建一個單例對象的靜態引用。然後,您將覆蓋它,並參考您從網絡獲得的任何內容。

這一點後,[UserProfile sharedInstance]任何調用將無法工作,因爲靜態參考現在已經沒有了。

你需要做的是創造,將採取在一個對象,並設置其值的方法。例如

[[UserProfile sharedInstance] setProfile: <profileObject>]; 

當你創建一個單身,你正在做的是詢問全班守住一個指向你的一個對象,因爲這個對象將在多個地方被引用,有點像一個全局變量。與全局變量不同,你不能簡單地用其他東西替換對象。你必須在初始化後使用getters/setter來獲取/更改值。

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;