iOS NSUserDefault存儲自定義對象

在.h中申明NSCoding協(xié)議
#import <Foundation/Foundation.h>

@interface TW_ProductionModel : NSObject<NSCoding>
@property(nonatomic, copy)NSString *productID;
@property(nonatomic, copy)NSString *oringalImageUrl;

在.m中實現(xiàn)initWithCoder和encodeWithCoder方法

1.普通實現(xiàn)NSCoding
#import "TW_ProductionModel.h"

@implementation TW_ProductionModel
//解檔
- (instancetype)initWithCoder:(NSCoder *)aDecoder{

if (self = [super init]) {
    
    self.productID = [aDecoder decodeObjectForKey:@"productID"];
    self.oringalImageUrl = [aDecoder decodeObjectForKey:@"oringalImageUrl"];
}
return self;
}
//歸檔  
- (void)encodeWithCoder:(NSCoder *)aCoder{

[aCoder encodeObject:self.productID forKey:@"productID"];
[aCoder encodeObject:self.oringalImageUrl forKey:@"oringalImageUrl"];
}
2.利用objc運行時實現(xiàn)自動歸檔、自動解檔
#import "TW_ProductionModel.h"
#import <objc/runtime.h>

@implementation TW_ProductionModel

//解檔
- (instancetype)initWithCoder:(NSCoder *)aDecoder{

if (self = [super init]) {
    
    Class c = self.class;
    // 截取類和父類的成員變量
    while (c && c != [NSObject class]) {
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList(c, &count);
        for (int i = 0; i < count; i++) {
            
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
            
            id value = [aDecoder decodeObjectForKey:key];
            
            [self setValue:value forKey:key];
        }
        // 獲得c的父類
        c = [c superclass];
        free(ivars);
    }
}
return self;
}

//歸檔 
- (void)encodeWithCoder:(NSCoder *)aCoder{

Class c = self.class;
// 截取類和父類的成員變量
while (c && c != [NSObject class]) {
    unsigned int count = 0;
    
    Ivar *ivars = class_copyIvarList(c, &count);
    
    for (int i = 0; i < count; i++) {
        Ivar ivar = ivars[i];
        NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
        
        id value = [self valueForKey:key];
        
        [aCoder encodeObject:value forKey:key];
    }
    c = [c superclass];
    // 釋放內存
    free(ivars);
}
}
將對象存儲到NUSerDefaults中
NSMutableArray *dataArr = [NSMutableArray array];
for (TW_FriendModel *friend in friends) {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:friend];
[dataArr addObject:data];
}
NSUserDefaults *userdafault = [NSUserDefaults standardUserDefaults];
[userdafault setObject:[NSArray arrayWithArray:dataArr] forKey:@"friends"];
[userdafault synchronize];
從NUSerDefault中取出對象
NSUserDefaults *userdafault = [NSUserDefaults standardUserDefaults];
NSArray *dataArr = [userdafault objectForKey:@"friends"];
NSMutableArray *arr = [NSMutableArray array];
for (NSData *data in dataArr) {
TW_FriendModel *friend = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[arr addObject:friend];
}

Objective-C運行時定義了幾種重要的類型。
Class:定義Objective-C類
Ivar:定義對象的實例變量,包括類型和名字。
Protocol:定義正式協(xié)議。
objc_property_t:定義屬性。叫這個名字可能是為了防止和Objective-C 1.0中的用戶類型沖突,那時候還沒有屬性。
Method:定義對象方法或類方法。這個類型提供了方法的名字(就是選擇器)、參數(shù)數(shù)量和類型,以及返回值(這些信息合起來稱為方法的簽名),還有一個指向代碼的函數(shù)指針(也就是方法的實現(xiàn))。
SEL:定義選擇器。選擇器是方法名的唯一標識符。
IMP:定義方法實現(xiàn)。這只是一個指向某個函數(shù)的指針,該函數(shù)接受一個對象、一個選擇器和一個可變長參數(shù)列表(varargs),返回一個對象

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,032評論 0 9
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,587評論 30 472
  • objc_getAssociatedObject返回與給定鍵的特定對象關聯(lián)的值。ID objc_getAssoci...
    有一種再見叫青春閱讀 1,745評論 0 7
  • 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,874評論 33 466
  • 時間無法倒退,你無法記起你曾經說過哪些微不足道卻沒有兌現(xiàn)的承諾。 感情復雜,因為你無法揣測他人同樣也無法揣測自己。...
    八月份的尾巴加1閱讀 504評論 0 0

友情鏈接更多精彩內容