我正在观察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]; 。
答案 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:
这是一个无法保证按预期工作的未记录的功能。