1. 程式人生 > >IOS 中的NSUserDefaults

IOS 中的NSUserDefaults

  •  NSUserDefaults 簡介

  在日常開發中經常遇到本地儲存,儲存的方式有很多,今天我們就來看看NSUserDefaults,NSUserDefaults是一個輕量級的本地化儲存的一個類。可以用它來儲存一些偏好設定,其儲存路徑為Library/Preferences。注意這個儲存並沒有加密,so。

  •  NSUserDefaults常用的方法

  NSUserDefaults常用的方法,使用和NSMutableDictionary的一些方法類似。如下,看不懂的請自行百度

複製程式碼
//設定
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;

- (void)setFloat:(float)value forKey:(NSString *)defaultName; - (void)setDouble:(double)value forKey:(NSString *)defaultName; - (void)setBool:(BOOL)value forKey:(NSString *)defaultName; - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0); - (void)setObject:(nullable id
)value forKey:(NSString *)defaultName; - (nullable NSString *)stringForKey:(NSString *)defaultName; //獲取 - (nullable NSArray *)arrayForKey:(NSString *)defaultName; - (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName; - (nullable NSData *)dataForKey:(NSString *)defaultName;
- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName; - (NSInteger)integerForKey:(NSString *)defaultName; - (float)floatForKey:(NSString *)defaultName; - (double)doubleForKey:(NSString *)defaultName; - (BOOL)boolForKey:(NSString *)defaultName; - (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
複製程式碼

  呼叫set的方法後,如果需要馬上同步需要synchronize方法。注意這個方法不要太頻繁呼叫。如果不呼叫synchronize,系統會每個一個時間段自動儲存。

  •   NSUserDefaults高階用法
  1. 儲存自定義物件

  NSUserDefaults只支援基本資料型別,如果需要儲存自定義的物件,就需要藉助NSKeyedArchiver將物件歸檔成NSData,然後再用[useDefault setObject: forKey:];方法儲存

複製程式碼
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.str = [aDecoder decodeObjectForKey:@"str"];
        self.interget = [aDecoder decodeIntegerForKey:@"interget"];
        self.flo = [aDecoder decodeDoubleForKey:@"flo"];
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.str forKey:@"str"];
    [aCoder encodeInteger:self.interget forKey:@"interget"];
    [aCoder encodeDouble:self.flo forKey:@"flo"];
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"%@;%ld,%f",self.str,(long)self.interget,self.flo];
}
複製程式碼 複製程式碼
    Demo *demo = [[Demo alloc]init];
    demo.str = @"test";
    demo.interget = 10;
    demo.flo = 12.0f;
    
    NSData *demoData = [NSKeyedArchiver archivedDataWithRootObject:demo];
    
    [useDefault setObject:demoData forKey:@"demo"];
    [useDefault synchronize];
    
    NSData *getData = [useDefault objectForKey:@"demo"];
    
    Demo *getDemo = [NSKeyedUnarchiver unarchiveObjectWithData:getData];
    NSLog(@"%@",getDemo);
複製程式碼

  2.資料共享 

// appA中
    NSUserDefaults *shareDefaultA = [[NSUserDefaults alloc]initWithSuiteName:@"com.storage.demo"];
    [shareDefaultA setObject:@"appA" forKey:@"shareKey"];
    // appB中
    NSUserDefaults *shareDefaultB = [[NSUserDefaults alloc]initWithSuiteName:@"com.storage.demo"];
    NSString *value = [shareDefaultB objectForKey:@"shareKey"];

  這裡就能解釋,同一個公司的app,裝了一個之後,在裝另一個,就會自動登入的功能。initWithSuiteName會在Library/Preference下新建一個以name為名字的plist檔案。[NSUserDefaults standardUserDefaults]是以bundle id為名字的一個plist檔案。利用這個我們可以給每一個使用者新建一個偏好設定的檔案,儲存面板,字型等,不同的使用者登入就會有不同的效果。

  • NSUserDefaults資料清除

  - (void)removePersistentDomainForName:(NSString *)domainName;清除domain下的所有資訊。在這裡要說一下NSUserDefaults的域,預設包含5個domain,分別是NSArgumentDomain,Application,NSGlobalDomain,Languages,NSRegistrationDomain。

    //清除Application所有的偏好設定,如果domainName是initWithSuiteName的name,則清除name對應的plist檔案的內容
    NSString *appDomain = [[NSBundle mainBundle]bundleIdentifier];
    [[NSUserDefaults standardUserDefaults]removePersistentDomainForName:appDomain];
  • NSUserDefaults注意的地方

  當我們獲取偏好設定的值的時候,需要注意,比如如下:[stand boolForKey:@"key1"];如果沒有對應的key1則獲取的值為預設值false。這種情況就有可能和有對應的key,並且對應的值為false時,區分不開,造成的邏輯錯誤。類似的還有[stand integerForKey:@""]等。

  對應的解決辦法是:

複製程式碼
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"true",@"test",@"3",@"inter", nil];
    //註冊一個預設的字典
    [stand registerDefaults:dict];
    
    BOOL isok = [stand boolForKey:@"test"];
    
    NSInteger inter = [stand integerForKey:@"inter"];
    
    NSLog(@"%d,,,,%ld",isok,(long)inter);

相關推薦

IOSNSUserDefaults的用法(輕量級本地資料儲存)

NSUserDefaults適合儲存輕量級的本地資料,比如要儲存一個登陸介面的資料,使用者名稱、密碼之類的,個人覺得使用NSUserDefaults是首選。下次再登陸的時候就可以直接從NSUserDefaults裡面讀取上次登陸的資訊咯。 因為如果使用自己建立的plist檔

IOS NSUserDefaults

 NSUserDefaults 簡介   在日常開發中經常遇到本地儲存,儲存的方式有很多,今天我們就來看看NSUserDefaults,NSUserDefaults是一個輕量級的本地化儲存的一個類。可以用它來儲存一些偏好設定,其儲存路徑為Library/Preference

iOSUDP的使用

ios receive str add rec void enc array 區分 // // ViewController.m // UDPDemo // // Created by qianfeng01 on 15-8-13. // Copyright (c

IOS公布應用程序,進度條一直不走怎麽處理

sso pan arch 技術分享 成功 csdn 版本 進度條 div 在IOS中公布應用程序非常是喜聞樂見。近期1周。我更新了6次版本號。可是時不時的會卡住,進度條不走。最後總結了幾個原因。 1.在公布前你要確認自己的證書是否配置正確 2.DNS域名server有沒

小胖說事28------iOSextern,static和const差別和使用方法

方法 string 文件 only 聲明 sans nbsp ring const 通俗的講: extern字段使用的時候,聲明的變量為全局變量,都能夠調用,也有這樣一種比較狹義的說法:extern能夠擴展一個類中的變量到還有一個類中;

iOS.pch文件怎樣使用

water csdn 例如 popu p s 老版本 tex content data- pch 能夠用來存儲共享信息,比方設備屏幕的寬度,高度。版本等等 公用信息 Xcode 老版本號會自己主動為我們創建pch文件,新版本號開始不自己主動創建了。假設須要使用能夠自己手

從deque到std::stack,std::queue,再到iOS NSArray(CFArray)

blog image nis get 容器 view 緩沖 div n-1 從deque到std::stack,std::queue,再到iOS 中NSArray(CFArray) deque deque雙端隊列,分段連續空間數據結構,由中控的map(與其說map,不

iOS 刪除cookie的正確做法

nbsp -h ring html tpc bold normal dom http 需求:刪除 qq 登錄的 cookie,保證下次打開 qq 登錄頁面不會默認登錄 實現: NSString *url =@"https://w.mail.qq.com

iOS 最新支付寶支付(AliPay) 韓俊強的博客

urlencode init 易用 微軟雅黑 per 回調 process class lis 每日更新關註:http://weibo.com/hanjunqiang 新浪微博 如今的支付方式一般有三種, 支付寶, 微信, 網銀. 個人認為最簡單易用的還是支付寶

RunTime運行時在iOS的應用之UITextField占位符placeholder

指向 field 失去 程序 拷貝 ace 底層 文本 ram RunTime運行時機制 runtime是一套比較底層的純C語言API, 屬於1個C語言庫, 包含了很多底層的C語言API。 在我們平時編寫的OC代碼中, 程序運行過程時, 其實最終都是轉成了runtime的C

淺談iOS的RunLoop

一段 ping itl rst 使用 http ram art 分享 首先解釋下為什麽是淺談,主要是RunLoop這個東西不單單是iOS的範疇,還涉及到操作系統,我指的淺談僅僅針對ios上層應用,底層的東西概不涉及 ,所以只能淺談淺談了。 在淺談RunLoop之前我們來寫個

iOSxib與storyboard原理,與Android界面布局的異同

ast int mvc color ron rect sdn -m control 用文本標記語言來進行布局,用的最多的應該是HTML語言。HTML能夠理解為有一組特殊標記的XML語言。 一、iOS中xib與storyboard顯示原理 在iOS中基

iOS 使用 iconfont

load pos sta 矢量圖 方法 如何 class 制圖 之間 如何使用自定義字體 在講icon font之前,首先先來看看普通自定義字體是如何在ios中使用的,兩個原理是一樣的。這裏以KaushanScript-Regular為例: Step 1:

iOS數組遍歷的方法及比較

結果 keyword div standard c語言 tracking dsm track 代碼 數組遍歷是編碼中很常見的一種需求,我們來扒一拔iOS裏面都有什麽樣的方法來實現,有什麽特點。 因為ios是兼容C語言的,所以c語言裏面的最最常見的for循環遍

iOS的崩潰類型

truct enable 進行 http arc product 包含 產生 abr http://blog.csdn.net/womendeaiwoming/article/details/44243571 OS中的崩潰類型 在這裏了解一下XCode用來表示

iOS3種正則表達式的使用與比較

regular null 後來 ons sta ring 學習 obj rst 之前我在博文中介紹過iOS中自帶正則表達式的使用(傳送門),後來我發現其實iOS中有三種方式來實現正則表達式的匹配。現在將他們都記錄在這裏: 1.利用NSPredicate(謂詞)匹配

iOS 的特殊字面量表示方法

text 標量 表示 寫法 .text unicode 引號 十六進制 回車符 轉義字符\0(空字符)、\\(反斜線)、\t(水平制表符)、\n(換行符)、\r(回車符)、\"(雙引號)、\‘(單引號)。單字節 Unicode 標量,寫成\xnn,其中nn為兩位十六進制

iOS 語音識別功能/語音轉文字教程具體解釋 韓俊強的博客

rdd tex forkey dex errortype map pin ins prop 原文地址:http://blog.csdn.net/qq_31810357/article/details/51111702前言:近期研究了一下語音識別,從百度語音識別到訊飛語音

iOS的事件處理

sdn ase ios sca ++ 介紹 con 表示 事件傳遞 前言:iOS中事件處理,是一個非常重要也非常難得地方。涉及到響應者鏈的地方的面試題,非常多工作兩三年的老鳥也未必能回答的非常專業。這裏具體介紹一下iOS中的事件處理,以及響應者鏈。 1

iOS 支付寶錢包具體解釋/第三方支付 韓俊強的博客

rod 一次 也有 rip icontrol data tar content mic 每日更新關註:http://weibo.com/hanjunqiang 新浪微博! iOS開發人員交流QQ群: 446310206 一、在ap