2017-07-03 49 views
0

我必须在超过5个视图控制器中显示来自NSUserDefaults的用户详细信息。所以我创建了一个NSObject子类,它将在调用第一个视图控制器viewDidLoad时从服务器加载用户详细信息。Objective C属性内存问题

这是我的第一个视图控制器的viewDidLoad

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 


    // Getting the Current User Details 
    CurrentUserDetails *userDetails = [[CurrentUserDetails alloc]init]; 
    [userDetails initializeTheCurrentUserData]; 

//CurrentUserDetails is my NSObject class 

} 

而且

#import <Foundation/Foundation.h> 

@interface CurrentUserDetails : NSObject 

@property(strong,nonatomic) NSString *memberName; 
@property(strong,nonatomic) NSString *designation; 
@property(strong,nonatomic) NSString *memberType; 
@property(strong,nonatomic) NSString *entreprenuer; 

@property(strong,nonatomic) NSDate *expiryDate; 

@property(strong,nonatomic) NSData *imageData; 


- (void) initializeTheCurrentUserData; 

@end 

和实施

@implementation CurrentUserDetails 


- (void) initializeTheCurrentUserData{ 

    NSData *data = [[NSUserDefaults standardUserDefaults] valueForKey:@"userDictionary"]; 
    NSDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

    self.memberName = [retrievedDictionary valueForKey:@"Name"]; 

    self.designation = [retrievedDictionary valueForKey:@"Designation"]; 

    self.memberType = [[retrievedDictionary valueForKey:@"Member_type"] stringValue]; 

    self.expiryDate = [retrievedDictionary valueForKey:@"Expiry"]; 
    self.kanaraEntreprenuer = [retrievedDictionary valueForKey:@"CityName"]; 

    NSString *imageUrl = [retrievedDictionary valueForKey:@"Member_image"]; 

    self.imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",[GlobalVariables getBaseURLForMemberImage],imageUrl]]]; 


} 

当IAM试图从这样的其他类的细节..

CurrentUserDetails *userDetails = [[CurrentUserDetails alloc]init]; 
    memberName = userDetails.memberName; 

    designation = userDetails.designation;  

    memberType = userDetails.memberType; 

    dateFromServer = userDetails.expiryDate; 
    entreprenuer = userDetails.entreprenuer; 
    imageDataFromServer = userDetails.imageData; 

我得到零值。

但是,如果每次调用initializeTheCurrentUserData方法,我都会得到确切的值。我虽然一旦一个属性被分配一个值,我们可以使用整个程序的属性。我越来越困惑..任何人都可以告诉我这个????。每当我想使用这些值时,是否需要每次调用initializeTheCurrentUserData?

+0

无需再次初始化您可以使用setter和getter方法存储的服务器响应 –

回答

2

一旦你设置了一个实例的属性,那个属性仍然适用于那个实例。但是,您正在使用[[CurrentUserDetails alloc] init]创建新实例。每个新实例将使用默认值进行初始化(的nil)。

请致电-initializeTheCurrentUserData-init,以便每个实例都将使用用户默认值进行初始化。

@implementation CurrentUserDetails 

- (instancetype)init { 
    self = [super init]; 
    if (self != nil) { 
     [self initializeTheCurrentUserData]; 
    } 
    return self; 
} 

- (void)initializeTheCurrentUserData { 
    … 
} 
+0

Thanks for the Answer .. –