2014-09-02 53 views
0

我有兩個類:超類,用戶及其子類,UserSession。用戶是非常簡單的,只是對於一些instanceVariables容器:對於高德Objective-C設置/訪問單例類超類中的iVars

//User.h  
@interface User : NSObject 

- (id)initWithJSON:(NSDictionary *)JSONDictionary; 

-(NSNumber *)getUserID; 
-(NSString *)getUserName; 
-(NSString *)getUserUsername; 
-(NSString *)getUserEmail; 
-(NSString *)getUserBio; 
-(void)setUserID:(NSNumber *)userID; 
-(void)setUserName:(NSString *)userName; 
-(void)setUserUsername:(NSString *)userUsername; 
-(void)setUserEmail:(NSString *)userEmail; 
-(void)setUserBio:(NSString *)userBio; 
@end 

//User.m 
@interface User() 

@end 

@implementation User 

NSNumber *_userID; 
NSString *_userName; 
NSString *_userUsername; 
NSString *_userEmail; 
NSString *_userBio; 

- (id)initWithJSON:(NSDictionary *)JSONDictionary 
{ 
    self = [super init]; 
    if (!self) 
     return nil; 

    _userID = JSONDictionary[@"userID"]; 
    _userName = JSONDictionary[@"userName"]; 
    _userUsername = JSONDictionary[@"userUsername"]; 
    _userEmail = JSONDictionary[@"userEmail"]; 
    _userBio = JSONDictionary[@"userBio"]; 

    return self; 
} 

加上相關getter和setter方法。

UserSession是一個單例類的子類用戶:

//UserSession.m 
@interface UserSession() 

@end 

@implementation UserSession 

static UserSession *_session = nil; 


-(void)updateUserForUserSessionWithParams:(NSDictionary *)params 
{ 
    [self setUserID:params[@"userId"]]; 
    [self setUserName:params[@"userName"]]; 
    [self setUserUsername:params[@"userUsername"]]; 
    [self setUserEmail:params[@"userEmail"]]; 
    [self setUserBio:params[@"userBio"]]; 
} 

+ (instancetype)sharedSession 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     // Create a session 
     _session = [[UserSession alloc] init]; 
    }); 
    return _session; 
} 

繼承人的問題:當我撥打電話一樣

[[UserSession sharedSession] 
updateUserForUserSessionWithParams:@{@"userId":@1], 
         @"userName":@"Steve Smith", 
         @"userUsername":responseObject[@"ssmith"], 
         @"userEmail":responseObject[@"[email protected]"], 
         @"userBio":responseObject[@"I'm steve smith"]}]; 

,然後在別處:

NSString* stringName = [[UserSession sharedSession] getUserName]; 
NSString* stringUsername = [[UserSession sharedSession] getUserUsername]; 
NSString* stringBio = [[UserSession sharedSession] getUserBio]; 

這些干將回報零!

對不起所有的代碼,但我認爲我在做一些愚蠢的錯誤。任何幫助將是驚人的。

在此先感謝!

+0

我想我們需要看一個setter和getter的例子,但有人不得不想知道爲什麼當你可以簡單地使用Objective-C屬性時自己寫這些東西? '@property NSNumber * userID;'會做到這一點,併爲您節省大量代碼。另外,我們需要看到' - [UserSession init]'方法。 – Caleb 2014-09-02 17:31:40

+0

ObjectiveC還是新的,所以我只是爲了自己的理智而自己寫它們。我不認爲這真的很重要。但我沒有 - [UserSession init]。我會在那裏放什麼? – 2014-09-02 17:42:46

回答

0

雖然我沒有 - [UserSession init]。我會在那裏放什麼?

嗯,首先一個子類,應該總是調用它的父類的初始化,所以你應該叫-initWithJSON:或其他一些User初始化。在這種情況下,這不會完全解決您的問題,但Objective-C嚴重依賴約定來使事情發揮作用,除非您真正瞭解自己在做什麼,否則最好遵守這些慣例。

我覺得你的代碼的主要問題是在這裏:

@implementation User 

NSNumber *_userID; 
NSString *_userName; 
NSString *_userUsername; 
NSString *_userEmail; 
NSString *_userBio; 

這些都不是你聲明的實例變量 - 它們是文件範圍的全局變量。你可以聲明實例變量作爲@implementation塊的一部分,但你仍然需要大括號像你這樣的@interface塊做:

@implementation User 
{ 
    NSNumber *_userID; 
    NSString *_userName; 
    NSString *_userUsername; 
    NSString *_userEmail; 
    NSString *_userBio; 
} 
//... 

我推薦使用這些屬性呢。如果你剛剛開始,訪問方法錯誤很容易,並且發現這些問題(如在這種情況下)通常並不容易。即使你有很多經驗,這可能並不容易,但這很難知道;有很多經驗的人通常會使用屬性。