标签: nsuserdefaults

在@Property上加载首选项时,应用程序崩溃(EXC_BAD_ACCESS)

这是许多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)

exc-bad-access nsuserdefaults

0
推荐指数
1
解决办法
1535
查看次数

NSUserDefaults standardUserDefaults无法清除的问题

所以我用它NSUserDefaults来存储我的FBAccessTokenKeyFBExpirationDateKey.我正在创建一个单例用户对象:

- (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仍然存在.为什么是这样?

facebook objective-c nsuserdefaults ios facebook-ios-sdk

0
推荐指数
1
解决办法
2495
查看次数

NSDictionary变成了NSCFString

我现在遇到一个奇怪的问题,即一个存储NSDictionaryNSUserDefaults,然后取回其转换为一个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)

objective-c nsuserdefaults ios

0
推荐指数
1
解决办法
1110
查看次数

iOS - NSUserDefaults值为'valueForKey'返回null但不为null

我试图通过检索每个产品标识符的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)

null nsuserdefaults ios

0
推荐指数
1
解决办法
7290
查看次数

默认UISwitch为YES然后使用NSUserDefaults保存状态

我试图获得的功能是默认我的切换状态,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键,有没有办法解决这个问题?

objective-c nsuserdefaults uiswitch ios

0
推荐指数
1
解决办法
2926
查看次数

如何保存和阅读NSUserDefaults的词典?

我有一个字典=字符串:( [(字符串)],[(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)

nsuserdefaults ios swift

0
推荐指数
1
解决办法
520
查看次数

如何在应用程序中保存用户名和密码,以便我们不需要登录应用程序?

我是 iOS 新手,我不知道如何在应用程序中保存用户名和密码,因此无需在应用程序中填写登录详细信息,直到用户不注销应用程序。我将我的用户名和密码保存在 NSUSerdefaults 中。我在谷歌上搜索。我发现这可以用 KeyChainWrapper 类来完成。我试过这种方式,但这不会给我有用的结果。任何人都可以帮助我解决这个问题。他/她对此将不胜感激。

keychain nsuserdefaults ios

0
推荐指数
1
解决办法
3259
查看次数

NSUserDefaults的可靠性如何?

不久前,我发现NSUserDefaults并思考:如果我能保留应用程序所需的信息NSUserDefaults,为什么还要创建数据库?这些是我的应用程序需要的变量:

  • 用户名(String类型)
  • 获得的硬币(Int16类型)
  • 雄鹿买了(Int16型)
  • 购买的物品(类型为[String])

NSUserDefaults作为使用数据库的替代方案有多适合?如果我使用NSUserDefaults而不是数据库,将所有"可购买"项目列为枚举是否合理?

nsuserdefaults ios

0
推荐指数
1
解决办法
163
查看次数

iOS应用程序是否在同一个地方保存NSUserdefaults信息?

我正在设计一个软针App.有两种方法可以快速保存iOS信息.

  1. NSUserDefaults的
  2. 钥匙扣

我只需要NSUserdefaults

我在这里阅读了一些教程链接

NSUerdefault可以保存与应用程序或用户数据相关的设置和属性.对象将保存在所谓的iOS"默认系统"中.iOS默认系统在应用程序的所有代码中都可用,保存到默认系统的任何数据都将通过应用程序会话保留.

问题是,如果还有其他应用程序也使用NSUserdefaults.

  1. 信息会发生冲突吗?
  2. 不同的应用程序是否在同一位置保存NSUserdefaults信息?
  3. 如果我设置代码来清理模拟器中的NSUserdefaults信息.我可以清除所有NSUserdefaults信息,还是只清除我设置代码的应用程序?

iphone nsuserdefaults ios

0
推荐指数
1
解决办法
75
查看次数

用户默认值还是核心数据?

我需要在我的应用程序(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)

xcode caching core-data nsuserdefaults swift

0
推荐指数
1
解决办法
3551
查看次数