2014-09-02 1 views
0

두 클래스가 있습니다. 하나는 수퍼 클래스, User와 그 서브 클래스, UserSession입니다. 인스턴스 변수에 대한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; 
} 

플러스 관련 세터와 게터 : 사용자는 단지 일부 instanceVariables에 대한 용기, 매우 간단합니다.

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

을 Heres 문제 :

사용자 세션은 사용자를 하위 클래스 싱글 톤 클래스입니다

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

이 게터 반환 : 나는 다른 곳에서 다음

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

와 같은 통화를 할 때 무!

모든 코드를 유감스럽게 생각합니다.하지만 저는 뭔가 바보 같은 짓을하고 있다고 생각합니다. 어떤 도움이라도 훌륭 할 것입니다.

미리 감사드립니다.

+0

우리는 setter와 getter의 예제를 볼 필요가있을 것입니다.하지만 Objective-C 속성을 사용할 수있을 때 왜이 글을 쓰고 있는지 궁금합니다. @property NSNumber * userID;는 트릭을 수행하고 많은 코드를 저장합니다. 또한, 우리는'- [UserSession init]'메소드를보아야 할 것이다. – Caleb

+0

아직도 ObjectiveC에 새로운 C 그래서 나는 그들 자신을 내 자신의 온건함을 위해서 쓰고있다. 나는 그것이 정말로 중요하다고 생각하지 않는다. 나는 [UserSession init]을 가지고 있지 않습니다. 내가 뭘 넣을 까? –

답변

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

가 어쨌든 이러한 속성을 사용하는 것이 좋습니다 것입니다. 액세서 메소드를 잘못 얻는 것은 쉽습니다. 이러한 유형의 문제점을 찾는 것은 (방금 시작한 경우) 일반적으로 쉽지 않습니다. 경험이 많더라도 쉽지 않을 수도 있지만 알기가 어렵습니다. 많은 경험을 가진 사람들은 일반적으로 속성을 사용합니다.

관련 문제