Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C设置/访问单亲班级的IVAR';超类_Objective C_Singleton_Subclass_Superclass - Fatal编程技术网

Objective-C设置/访问单亲班级的IVAR';超类

Objective-C设置/访问单亲班级的IVAR';超类,objective-c,singleton,subclass,superclass,Objective C,Singleton,Subclass,Superclass,我有两个类:一个超类User和它的子类UserSession。用户非常简单,只是一些InstanceVariable的容器: //User.h @interface User : NSObject - (id)initWithJSON:(NSDictionary *)JSONDictionary; -(NSNumber *)getUserID; -(NSString *)getUserName; -(NSString *)getUserUsername; -(NSString *)g

我有两个类:一个超类User和它的子类UserSession。用户非常简单,只是一些InstanceVariable的容器:

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

以及IVAR的相关设置器和获取器

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[@"ssmith@test.com"],
                      @"userBio":responseObject[@"I'm steve smith"]}];
然后在其他地方:

NSString* stringName = [[UserSession sharedSession] getUserName];
NSString* stringUsername = [[UserSession sharedSession] getUserUsername];
NSString* stringBio = [[UserSession sharedSession] getUserBio];
这些获得者归零

抱歉这么多代码,但我觉得我做错了什么。任何帮助都将是惊人的

提前谢谢

但是我没有-[UserSession init]。我在里面放什么

首先,子类应该始终调用它的超类的初始值设定项,因此您应该调用
-initWithJSON:
或其他
用户
初始值设定项。在这种情况下,这并不能完全解决您的问题,但是Objective-C在很大程度上依赖于约定来实现任务,除非您真正理解自己在做什么,否则最好坚持这些约定

我认为您的代码的主要问题在于:

@implementation User

NSNumber *_userID;
NSString *_userName;
NSString *_userUsername;
NSString *_userEmail;
NSString *_userBio;
这些不是您要声明的实例变量--它们是文件范围的全局变量。您可以将实例变量声明为
@实现
块的一部分,但仍然需要大括号,就像在
@接口
块中一样:

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

无论如何,我建议使用这些属性。访问器方法很容易出错,如果您刚刚开始,发现这些类型的问题(如本例)通常并不容易。即使你有很多经验,这也可能不容易,但这很难知道;有很多经验的人通常使用属性。

我想我们需要看一个setter和getter的例子,但是人们不得不想知道,当你可以简单地使用Objective-C属性时,为什么你要自己编写这些呢<代码>@property NSNumber*userID将完成此操作并为您节省大量代码。此外,我们还需要查看
-[UserSession init]
方法。ObjectiveC仍然是新手,所以我只是为了自己的理智而编写它们。我认为这并不重要。但是我没有-[UserSession init]。我在里面放什么?
@implementation User
{
    NSNumber *_userID;
    NSString *_userName;
    NSString *_userUsername;
    NSString *_userEmail;
    NSString *_userBio;
}
//...