这是许多EXC_BADACCES问题之一,但我已经做了很长时间的研究,并认为这个问题尚未得到解答.我的应用程序在首选项中保存数据.一切都很好,如果我删除首选项并启动应用程序,那么根本不会发生任何加载.但如果发生加载,就会出现问题.我必须保存一个主数组,其中包含一个名为Box的自写对象.One Box有一个NSString*boxName和六个NSMutableArray*,它们包含另一个自编写的对象,称为Flashcard,它包含两个NSString*:问题和答案.如果AppDelegate获取消息applicationWillTerminate,它将使用NSKeyedArchiver对主数组(称为boxArray)进行编码,并将其保存在首选项中.在AppControll的init方法中,此归档文件是从首选项加载的:
- (id)init {
self = [super init];
if (self) {
// Initialization code here.
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSData* archive = [defaults objectForKey:@"boxArray"];
if (archive) {
NSArray* array = [NSKeyedUnarchiver unarchiveObjectWithData:archive];
boxArray = [NSMutableArray arrayWithArray:array];
} else {
boxArray = [[NSMutableArray alloc] init];
}
}
return self;
Run Code Online (Sandbox Code Playgroud)
}
在Box的encodeWithCoder方法中,它为它的所有数组创建了sereval NSData*对象,就像这样.
NSData* p1archv = [NSKeyedArchiver archivedDataWithRootObject:phase1];
[aCoder encodeObject:p1archv forKey:@"phase1"];
Run Code Online (Sandbox Code Playgroud)
它加载如下所有内容:NSData*p1archv = [aDecoder decodeObjectForKey:@"phase1"];
if (p1archv) {
NSArray* a = [NSKeyedUnarchiver unarchiveObjectWithData:p1archv];
phase1 = [NSMutableArray arrayWithArray:a];
NSLog(@"loaded phase1: %@",phase1); …Run Code Online (Sandbox Code Playgroud) 所以我用它NSUserDefaults来存储我的FBAccessTokenKey和FBExpirationDateKey.我正在创建一个单例用户对象:
- (id)init
{
self = [super init];
if (self != nil) {
facebook = [[Facebook alloc] initWithAppId:kAppId andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"] ) {
NSLog(@"ACCESS KEY IS NOT EMPTY");
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
} else {
NSLog(@"ACCESS KEY IS EMPTY");
}
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我还实现了一个在我注销时调用的didLogout方法:
- (void)fbDidLogout {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBAccessTokenKey"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBExpirationDateKey"];
}
Run Code Online (Sandbox Code Playgroud)
这基本上清除/刷新了令牌密钥.现在真正的问题是,当我点击退出,退出应用程序,然后再次运行应用程序时,它会检测到该密钥FBAccessTokenKey并且FBExpirationDateKey仍然存在.为什么是这样?
我现在遇到一个奇怪的问题,即一个存储NSDictionary的NSUserDefaults,然后取回其转换为一个NSCFString.
这是我保存数据的地方:
- (void)saveProgress
{
// Save our progress to the user defaults.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *progressDict = [NSMutableDictionary dictionary];
if ([defaults objectForKey:@"session_progress"] != nil) {
[progressDict addEntriesFromDictionary:[defaults dictionaryForKey:@"session_progress"]];
}
NSMutableDictionary *targetsDict = [NSMutableDictionary dictionary];
if ([progressDict objectForKey:@"targets"] != nil) {
[targetsDict addEntriesFromDictionary:[progressDict objectForKey:@"targets"]];
}
NSMutableDictionary *trackableDict = [NSMutableDictionary dictionary];
if ([targetsDict objectForKey:@"mda_sao_ext_04"]) {
[trackableDict addEntriesFromDictionary:[targetsDict objectForKey:@"mda_sao_ext_04"]];
}
[trackableDict setObject:[NSNumber numberWithBool:YES]
forKey:@"viewed"];
NSLog(@"SAVE Trackable %@ %@", [trackableDict class], trackableDict);
[targetsDict setObject:trackableDict …Run Code Online (Sandbox Code Playgroud) 我试图通过检索每个产品标识符的NSUserDefaults值来查看用户是否已进行购买.我在购买产品时保存了该值并且设置正确.
调用时,键值对正确显示:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Run Code Online (Sandbox Code Playgroud)
这样:
"com.COMPANY.PRODUCTIDENTIFIER" = 1;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试实际验证特定的键值时,它总是返回null:
for (NSString * productIdentifier in _productIdentifiers) {
NSLog(@"ProductIdentifier: %@",productIdentifier);
NSLog(@"Defaults Value: %@",[[NSUserDefaults standardUserDefaults] valueForKey:productIdentifier]);
NSLog(@"Defaults Bool: %d",[[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]);
NSLog(@"Defaults Object: %@",[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier]);
BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
if (productPurchased) {
[_purchasedProductIdentifiers addObject:productIdentifier];
NSLog(@"Previously purchased: %@", productIdentifier);
} else {
NSLog(@"Not purchased: %@", productIdentifier);
}
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
2013-03-10 17:45:13.609 COMPANY[1140:907] ProductIdentifier: com.COMPANY.PRODUCTIDENTIFIER
2013-03-10 17:45:13.611 COMPANY[1140:907] Defaults Value: (null)
2013-03-10 17:45:13.612 COMPANY[1140:907] Defaults Bool: 0
2013-03-10 17:45:13.611 COMPANY[1140:907] …Run Code Online (Sandbox Code Playgroud) 我试图获得的功能是默认我的切换状态,setOn:YES但一旦用户切换UISwitch保存该切换的状态NSUserDefaults.
在我看来,我最好怎么做?我目前在我的代码中有以下代码viewDidLoad:
if([[NSUserDefaults standardUserDefaults] boolForKey:@"lights"] == 0){
[lightsSwitch setOn:NO];
}
Run Code Online (Sandbox Code Playgroud)
在我的toggleLightSwitch:(id)sender:
[[NSUserDefaults standardUserDefaults] setBool:lightsSwitch.isOn
forKey:@"lights"];
Run Code Online (Sandbox Code Playgroud)
但功能将默认为setOn:NO.由于NSUserDefault默认NO为bool键,有没有办法解决这个问题?
我有一个字典=字符串:( [(字符串)],[(Int)],NSDate,Bool,[(字符串)])我尝试将它解构为单独的数组,然后app调用applicationWillTerminate
var codes = [(String)]()
var messages = [[String]]()
var senders = [[Int]]()
var dates = [(NSDate)]()
var bools = [(Bool)]()
var pairs = [[String]]()
for code in self.dictionary.keys {
codes.append(code)
messages.append(self.dictionary[code]!.0)
senders.append(self.dictionary[code]!.1)
dates.append(self.dictionary[code]!.2)
bools.append(self.dictionary[code]!.3)
pairs.append(self.dictionary[code]!.4)
}
self.userDefaultsMessages.setObject(codes, forKey: "userMessagesArrays")
self.userDefaultsSenders.setObject(messages, forKey: "userSentArrays")
self.userDefaultsDates.setObject(senders, forKey: "userDatesArray")
self.userDefaultsDeletedBool.setObject(dates, forKey: "userDeletedArrays")
self.userDefaultsPairs.setObject(bools, forKey: "userPairsArrays")
self.userDefaultsCodeKeys.setObject(pairs, forKey: "userCodesArrays")
self.userDefaultsCodeKeys.synchronize()
self.userDefaultsMessages.synchronize()
self.userDefaultsSenders.synchronize()
self.userDefaultsDates.synchronize()
self.userDefaultsDeletedBool.synchronize()
self.userDefaultsPairs.synchronize()
Run Code Online (Sandbox Code Playgroud)
当app调用applicationDidBecomeActive时,我会尝试将它们全部拉回来
//如果let savedCodesArray:AnyObject,请阅读?= self.userDefaultsCodeKeys.objectForKey("userCodesArrays"){self.userCodes = savedCodesArray!如![串]
if let savedMessagesArray : AnyObject? = self.userDefaultsCodeKeys.objectForKey("userMessagesArrays") {
self.Usermessages = savedMessagesArray! as! …Run Code Online (Sandbox Code Playgroud) 我是 iOS 新手,我不知道如何在应用程序中保存用户名和密码,因此无需在应用程序中填写登录详细信息,直到用户不注销应用程序。我将我的用户名和密码保存在 NSUSerdefaults 中。我在谷歌上搜索。我发现这可以用 KeyChainWrapper 类来完成。我试过这种方式,但这不会给我有用的结果。任何人都可以帮助我解决这个问题。他/她对此将不胜感激。
不久前,我发现NSUserDefaults并思考:如果我能保留应用程序所需的信息NSUserDefaults,为什么还要创建数据库?这些是我的应用程序需要的变量:
NSUserDefaults作为使用数据库的替代方案有多适合?如果我使用NSUserDefaults而不是数据库,将所有"可购买"项目列为枚举是否合理?
我正在设计一个软针App.有两种方法可以快速保存iOS信息.
我只需要NSUserdefaults
我在这里阅读了一些教程链接
NSUerdefault可以保存与应用程序或用户数据相关的设置和属性.对象将保存在所谓的iOS"默认系统"中.iOS默认系统在应用程序的所有代码中都可用,保存到默认系统的任何数据都将通过应用程序会话保留.
问题是,如果还有其他应用程序也使用NSUserdefaults.
我需要在我的应用程序(Xcode 9.1,Swift 4)中存储一些对象。目前,我将其存储为:
class myItemManager {
var items: [myItem]? {
didSet {
Cache.c.items = items
}
}
static var manager = myItemManager() {
didSet {
myItemManager.manager.items = Cache.c.items
}
}
}
class Cache {
private let uds = UserDefaults.standard
static let c = Cache()
var items: [(myItem)]? {
get {
if let decoded = uds.object(forKey: Constants.Cache.myItem) as? Data {
let decodedItems = NSKeyedUnarchiver.unarchiveObject(with: decoded) as? [myItem]
return decodedItems
} else {
return nil
}
}
set {
let encodedData: Data …Run Code Online (Sandbox Code Playgroud)