NSUserDefaults值变为零

时间:2014-05-15 06:47:01

标签: iphone ios7 nsuserdefaults

我正在观察NSUserDefaults的奇怪行为。在iphone 4(32位)测试期间,它工作正常。当我使用iPhone 5S(64位)向我的客户端发送相同的应用程序时,NSUserDefault值变为零。 NSUserDefaults的行为是否在 32位 64位 ios版本上发生变化?在NSUserDefaults中保存值后,我还使用了 [[NSUserDefaults standardUserDefaults] synchronize] 。我正在从ios 7.1版本中观察这种行为。

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   //to stop updating locations in subsequent launches
if (![@"1" isEqualToString:[[NSUserDefaults standardUserDefaults]
                                objectForKey:@"aValue"]]) {

        //Action here
        NSLog(@"LOCATION IS ON");
        locationManager = [[CLLocationManager alloc] init];
        locationVC  = [[LocationVC alloc]init];
        [locationVC InitializeWith:_managedObjectContext LocationManager:locationManager];
        //[locationVC InitializeWith:_managedObjectContext LocationManager:nil];

    }

    else {

        NSLog(@"LOCATION IS OFF");
        locationManager = [[CLLocationManager alloc] init];
        locationVC  = [[LocationVC alloc]init];
        //[locationVC InitializeWith:_managedObjectContext LocationManager:locationManager];
        [locationVC InitializeWith:_managedObjectContext LocationManager:nil];

    }
}

LocationVC.m

    LocationVC *locationVC;

-(void) InitializeWith:(NSManagedObjectContext *)context LocationManager:(CLLocationManager *)locationManager{

    //to update location during first launch
    if (![@"1" isEqualToString:[[NSUserDefaults standardUserDefaults]
                                objectForKey:@"aValue"]]) {

        [[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:@"aValue"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        NSLog(@"LOCATION IS ON");
       self->locationManager=locationManager;
       self->locationManager.delegate = self;
       self->locationManager.desiredAccuracy = kCLLocationAccuracyBest;
       self->locationManager.distanceFilter = kCLDistanceFilterNone;
       [self->locationManager startUpdatingLocation];

        _managedObjectContext=context;      
    }
    //in subsequent launches 
    else{       
        NSLog(@"LOCATION IS OFF");
         _managedObjectContext=context;
         [self->locationManager stopUpdatingLocation];
    }
}

在我客户的iPhone 5S(64位)中,位置图标在10分钟后重新出现,尽管我已在后续应用程序的lauches中调用 [self-> locationManager stopUpdatingLocation];

1 个答案:

答案 0 :(得分:0)

  

NSUserDefaults的行为是否在32位和64位ios版本上发生变化?

不,NSUserDefaults(基于属性列表)旨在与平台无关。您甚至可以将二进制plist文件从Power PC Mac复制到Intel机器,iPhone 32位或iPhone 64位,该文件将始终产生相同的结果。

已知NSUserDefaults类非常强大。

错误很可能在您的代码中。如果您需要更多帮助,请提供有关如何检测并重现错误的更多信息。

编辑:您似乎使用了错误的方法来设置@“aValue”:

[[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:@"aValue"];

设置首选项的正确方法是-setObject:forKey:

setValue:fortKey:是KVC的一部分,未记录在NSUserDefaults中执行某些操作。虽然在当前的实现中似乎(iOS 7.1)NSUserDefaults覆盖setValue:forKey:这是一个无法保证按预期工作的未记录的功能。