iOS 自訂對象及子類及模型套模型的拷貝、Archive Storage的通用代碼

來源:互聯網
上載者:User

標籤:aar   自訂對象   擷取   obj   數組   and   gpo   取值   bsp   

一、runtime實現通用copy

如果自訂類的子類,模型套模型你真的會copy嗎,小心有坑。

copy需要自訂類繼承NSCopying協議

#import <objc/runtime.h>- (id)copyWithZone:(NSZone *)zone {        id obj = [[[self class] allocWithZone:zone] init];    Class class = [self class];    while (class != [NSObject class]) {        unsigned int count;        Ivar *ivar = class_copyIvarList(class, &count);        for (int i = 0; i < count; i++) {            Ivar iv = ivar[i];            const char *name = ivar_getName(iv);            NSString *strName = [NSString stringWithUTF8String:name];            //利用KVC取值            id value = [[self valueForKey:strName] copy];//如果還套了模型也要copy呢            [obj setValue:value forKey:strName];        }        free(ivar);                class = class_getSuperclass(class);//記住還要遍曆父類的屬性呢    }    return obj;}
二、runtime實現通用歸檔解檔

歸檔解檔需要自訂類繼承NSCoding協議

#import <objc/runtime.h>

#pragma mark - 歸檔、解檔- (void)encodeWithCoder:(NSCoder *)encoder { Class class = [self class]; while (class != [NSObject class]) { unsigned int count; Ivar *ivar = class_copyIvarList(class, &count); for (int i = 0; i < count; i++) { Ivar iv = ivar[i]; const char *name = ivar_getName(iv); NSString *strName = [NSString stringWithUTF8String:name]; //利用KVC取值 id value = [self valueForKey:strName]; [encoder encodeObject:value forKey:strName]; } free(ivar); class = class_getSuperclass(class);//記住還要遍曆父類的屬性呢 }}- (id)initWithCoder:(NSCoder *)decoder { self = [super init]; if (self) { Class class = [self class]; while (class != [NSObject class]) { unsigned int count = 0; //擷取類中所有成員變數名 Ivar *ivar = class_copyIvarList(class, &count); for (int i = 0; i < count; i++) { Ivar iva = ivar[i]; const char *name = ivar_getName(iva); NSString *strName = [NSString stringWithUTF8String:name]; //進行解檔取值 id value = [decoder decodeObjectForKey:strName]; //利用KVC對屬性賦值 [self setValue:value forKey:strName]; } free(ivar); class = class_getSuperclass(class);//記住還要遍曆父類的屬性呢 } } return self;}
三、NSUserDefaults儲存自訂對象
//1.自訂類繼承NSCoding協議,並實現歸檔解檔,前面介紹過了,不多說//2.將自訂對象轉NSDataNSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];//3.存到NSUserDefaults[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"myStudent"];[[NSUserDefaults standardUserDefaults] synchronize];//這句要寫,很多人都忘了//4.存數組,數組中包含自訂對象[dataArray addObject:data];//這個data是第2步歸檔得到的data//5.NSUserDefaults只能存不可變數組,不要忘了轉換成不可變NSArray * array = [NSArray arrayWithArray:dataArray];[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"students"];
四、NSUserDefaults中讀取歸檔的自訂對象
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myStudent"];Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];

 

iOS 自訂對象及子類及模型套模型的拷貝、Archive Storage的通用代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.