Runtime_实例变量遍历

写一个分类 遵守协议

#import <Foundation/Foundation.h>


demo下载地址 http://download.csdn.net/detail/xlsn0w/9429196


@interface NSObject (Encode) <NSCoding>


@end


在m文件里面实现归档 反归档方法

#import <objc/objc-runtime.h>


@implementation NSObject (Encode)


- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    

    self = [selfinit];//如果在分类中要使用super的方法因为木有super 只能self来替代

    

    if (self) {

        

        //1. 获取all 实例变量

        unsigned int outCount =0;

        Ivar *ivar =   class_copyIvarList([self class],&outCount);

        

        for (int i =0; i < outCount; i++) {

            

            //2. 获取当前的实例变量

            Ivar ivar2 = ivar[i];

            

            const char *nameUTF = ivar_getName(ivar2);

            NSString *name = [NSStringstringWithUTF8String:nameUTF];

            

            id value = [aDecoder decodeObjectForKey:name];

            

            

            //5 对应的实例变量赋值 KVC

            

            [self setValue:value forKey:name];

        }

        

        free(ivar);

        

    }

    

    

    return self;

}


- (void)encodeWithCoder:(NSCoder *)aCoder {

    

    //1.获取所有的实例变量

    unsigned int outCount =0;

    Ivar *ivar = class_copyIvarList([selfclass], &outCount);

    

    

    for (int i =0; i < outCount; i++) {

        

        //2 get当前实例变量

        Ivar ivar2 = ivar[i];

        

        //3 获取当前实例变量的名字

        

        const char *nameUTF =ivar_getName(ivar2);

        NSString *name = [NSStringstringWithUTF8String:nameUTF];

        

        //4 获取实例变量的值 KVC

        id value = [selfvalueForKey:name];


        [aCoder encodeObject:value forKey:name];

    }

    //5 free()释放

    free(ivar);

}


在控制器里面实现Person的属性的验证

#import "ViewController.h"


#import "NSObject+Encode.h"

#import <objc/objc-runtime.h>

#import "Person.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    Person *person = [Personnew];

    person.name = @"XL";

    person.age = 24;

    

    NSMutableData *data = [NSMutableDatadataWithCapacity:5];

    NSKeyedArchiver *arc = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data];

    [arc encodeObject:person forKey:@"person"];

    [arc finishEncoding];

    

    NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiveralloc] initForReadingWithData:data];

    Person *person2 = [unarc decodeObjectForKey:@"person"];

    

    NSLog(@"%@",person2.name);

    NSLog(@"%ld",(long)person2.age);

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值