Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.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 NSUserDefults返回null_Objective C_Ios_Nsuserdefaults - Fatal编程技术网

Objective c NSUserDefults返回null

Objective c NSUserDefults返回null,objective-c,ios,nsuserdefaults,Objective C,Ios,Nsuserdefaults,我在NSUserDefults中保存自定义对象该对象具有多个属性, 我在AppDelegate中初始化自定义对象的值, 我的问题是,当我尝试在viewcontroller didLoad方法中检索自定义对象属性“userToken”时,它会工作,数据是正确的,但当我在视图控制器的另一个方法中检索它时,我会得到NULL。请注意,另一个属性“uId”返回正确的值,我以相同的方式检索对象 我做错了什么?非常感谢你的帮助 下面是我如何保存和检索对象 +(void)SaveUser:(User *)use

我在NSUserDefults中保存自定义对象该对象具有多个属性, 我在AppDelegate中初始化自定义对象的值, 我的问题是,当我尝试在viewcontroller didLoad方法中检索自定义对象属性“userToken”时,它会工作,数据是正确的,但当我在视图控制器的另一个方法中检索它时,我会得到NULL。请注意,另一个属性“uId”返回正确的值,我以相同的方式检索对象

我做错了什么?非常感谢你的帮助

下面是我如何保存和检索对象

+(void)SaveUser:(User *)user
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSData *userData = [NSKeyedArchiver archivedDataWithRootObject:user];
    [userDefaults setObject:userData forKey:@"User"];  
    [userDefaults synchronize]; 
}

+(User*)retrieveUser
{
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    NSData *userData = [ud objectForKey:@"User"];
    User *user = [NSKeyedUnarchiver unarchiveObjectWithData:userData];
    return user;    
}
下面是用户对象的实现

- (id)initWithCoder:(NSCoder *)decoder 
{
   self = [super init];
   if (self)
   {    
        //uId and userToken are of type NSString
        self.uId = [decoder decodeObjectForKey:@"UID"];
        self.userToken = [decoder decodeObjectForKey:@"DeviceToken"];
   }
   return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder 
{
    [encoder encodeObject:self.uId forKey:@"UID"];
    [encoder encodeObject:self.userToken forKey:@"DeviceToken"];
}
试试这个: 还要注意的是,+mean作为静态函数,没有访问类属性的权限,使得saveuser或retrieveuser函数中的所有内容也可以解码,而无需在类外调用另一个方法来解码。这就是为什么在loadview之外使用+方法时,它总是得到空值的原因

+(void)SaveUser:(User *)user
{
    NSUserDefaults *UserDefaults = [NSUserDefaults standardUserDefaults];
    [UserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:user] forKey:@"User"];
    [UserDefaults synchronize];
}

+(User*)retrieveUser
{
    NSUserDefaults *UserDefaults = [NSUserDefaults standardUserDefaults];
    NSData *userData = [UserDefaults objectForKey:@"User"];
    User *user = [NSKeyedUnarchiver unarchiveObjectWithData:userData];
    return user;
}

thnx但是SaveUser:和retrieveUser方法是实用程序类的一部分,因此+,,这些方法不是用户类的一部分!如果您试图像使用一样将initWithCoder和encodeWithCoder放在实用程序类中,那么您使用的方法将始终为null,因为您无法访问静态类的属性。。因此,如果您仅使用来自实用程序类或应用程序委托的这两个函数SaveUser retrieveUser,它将起作用,因为它们适用于我在viewdidload内部或外部进行的任何调用,但这正是我要做的,initWithCoder end encodeWithCoder不在实用程序类中,它们在用户类中,让我抓狂的是,它有时工作,有时只返回null!我找到了一个解决方案,我仍然没有找出问题所在我只是改变了调用retrieveUser方法的方法!thnx很多@Mina