Archivado y desarchivado de objetos iOS-Implementación en tiempo de ejecución

Prefacio

¿Qué es la serialización en el artículo anterior ? ¿Cuál es el papel de la serialización? ¿Cómo lograr la serialización en iOS? En este, hemos implementado la operación de serialización del objeto en métodos comunes, es decir, archivando y desarchivando.

NSCodingArchivar y desarchivar objetos iOS que siguen el protocolo es un método de persistencia de datos que usamos a menudo. Pero si hay demasiados atributos del objeto, aún implementamos el método encodeObject:forKey:y el decodeObjectForKey:método para cada atributo. La cantidad de código escrito de esta manera será demasiado engorrosa. Hoy, te enseñaré un método simple para implementarlo.

1. Cree NSCodingun objeto Persona que siga el protocolo


#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject<NSCoding>

@property (copy,   nonatomic) NSString *name;
@property (copy,   nonatomic) NSString *sex;
@property (assign, nonatomic) NSInteger age;
@property (assign, nonatomic) NSInteger height;

@end

NS_ASSUME_NONNULL_END

Código 2.Person.m para lograr archivar y desarchivar

  • archivo en tiempo de ejecución
- (void)encodeWithCoder:(NSCoder *)coder {
		//告诉系统归档的属性是哪些
	unsigned int count = 0;//表示对象的属性个数
	Ivar *ivars = class_copyIvarList([Person class], &count);
	for (int i = 0; i < count; i++) {
			//拿到Ivar
		Ivar ivar = ivars[i];
		const char *name = ivar_getName(ivar);//获取到属性的C字符串名称
		NSString *key = [NSString stringWithUTF8String:name];//转成对应的OC名称
		//归档 -- 利用KVC
		[coder encodeObject:[self valueForKey:key] forKey:key];
	}
	free(ivars);
		//在OC中使用了Copy、Creat、New类型的函数,需要释放指针!!(注:ARC管不了C函数)
}
  • desarchivar en tiempo de ejecución
- (instancetype)initWithCoder:(NSCoder *)coder {
	self = [super init];
	if (self) {
			//解档
		unsigned int count = 0;
		Ivar *ivars = class_copyIvarList([Person class], &count);
		for (int i = 0; i<count; i++) {
				//拿到Ivar
			Ivar ivar = ivars[i];
			const char *name = ivar_getName(ivar);
			NSString *key = [NSString stringWithUTF8String:name];
				//解档
			id value = [coder decodeObjectForKey:key];
				// 利用KVC赋值
			[self setValue:value forKey:key];
		}
		free(ivars);
	}
	return self;
}


La ventaja de usar el tiempo de ejecución es evidente, no importa cuántos atributos tenga el objeto, se puede hacer a través de este bucle for, que es muy poderoso y muy conveniente. Me pregunto si lo aprendiste.

Supongo que te gusta

Origin blog.csdn.net/zjpjay/article/details/86552305
Recomendado
Clasificación