2017-07-03 48 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 .. –