Objective-C设置/访问单亲班级的IVAR';超类
我有两个类:一个超类User和它的子类UserSession。用户非常简单,只是一些InstanceVariable的容器: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.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;
}
//...