在.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),返回一個對象