2014-09-02 42 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; 
} 
//... 

我推荐使用这些属性呢。如果你刚刚开始,访问方法错误很容易,并且发现这些问题(如在这种情况下)通常并不容易。即使你有很多经验,这可能并不容易,但这很难知道;有很多经验的人通常会使用属性。