一些语法

更改对象的类/获取对象的类

1
2
3
4
CustomClass *class1 = [[CustomClass alloc]init];
Class aclass =object_setClass(class1, [TestClass class]);
NSLog(@"aclass--%@",NSStringFromClass(aclass));
NSLog(@"class1--%@",NSStringFromClass([class1 class]));

获取对象的类名

1
2
3
4
CustomClass *class = [[CustomClass alloc]init];
const char *name = object_getClassName(class);
NSString *className = [NSString stringWithUTF8String:name];
NSLog(@"%@",className);

获取一个类的所有方法, 所有的get set方法都能得到 还有公有的和私有的方法也能得到

1
2
3
4
5
6
7
8
9
10
unsigned int count = 0;
Method *methods = class_copyMethodList([CustomClass class], &count);
for (int i=0; i<count; i++)
{
SEL name =method_getName(methods[i]);
const char *str = sel_getName(name);
NSString *str1 = [NSString stringWithUTF8String:str];
NSLog(@"%@",str1);
}
free(methods);

获取一个类的所有属性,私有成员变量也可以得到

1
2
3
4
5
6
7
8
9
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList([CustomClass class], &count);
for (int i=0; i<count; i++)
{
const char *propertyname = property_getName(properties[i]);
NSString *str = [NSString stringWithUTF8String:propertyname];
NSLog(@"%@",str);
}
free(properties);

常见的使用

对象归档解档时需要的编码操作,假设对象有多个成员变量

1
2
3
4
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString * name;
@property(nonatomic,assign)float *height;
@property(nonatomic,copy)NSString *hobby;

归档处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(void)encodeWithCoder:(NSCoder *)aCoder
{
unsigned int count=0;
// 获取所有从成员变量
Ivar *ivars = class_copyIvarList([person class], &count);
for (int i=0; i<count; i++)
{
Ivar ivar = ivars[i]; const char *name = ivar_getName(ivar);
NSLog(@"%s",name);
// 归档
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
free(ivars); }

解档处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init])
{
unsigned int count =0;
Ivar *ivars = class_copyIvarList([person class], &count); for (int i=0; i<count; i++)
{
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
// 解档
NSString *key = [NSString stringWithUTF8String:name];
id value =[aDecoder decodeObjectForKey:key];大专栏  Runtime常见使用pan>
[self setValue:value forKey:key];
}
free(ivars); }
return self;
}

给分类增加成员变量

1
2
3
4
5
6
7
8
9
10
@property(nonatomic,copy)NSString *name;
static const char *key = "name";
-(void)setName:(NSString *)name
{
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)name
{
return objc_getAssociatedObject(self, key);
}

字典转模型

  • 供解析的例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    NSDictionary *dict3 = @{
    @"statuses" : @[
    @{
    @"text" : @"今天天气真不错!", @"user" : @{
    @"name" : @"Rose",
    @"icon" : @"nami.png"
    }
    }, @{
    @"text" : @"明天去旅游了", @"user" : @{
    @"name" : @"Jack",
    @"icon" : @"lufy.png"
    }
    } ], @"ads" : @[
    @{
    @"image" : @"ad01.png",
    @"url" : @"http://www.ad01.com"
    },
    @{
    @"image" : @"ad02.png",
    @"url" : @"http://www.ad02.com"
    }
    ], @"totalNumber" : @"2014",
    @"previousCursor" : @"13476589",
    @"nextCursor" : @"13476599"
    };
  • 为nsobject增加一个分类。传入一个字典参数。

  • 获得全体成员变量 Ivar *ivarList = class_copyIvarList(self, &count);
  • 获得每个成员变量的名称 NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
  • 取出字典中该name名称的对应的value值,id value = Dict[key];判断value是什么类型
  • 如果value是字典类型,需要得到该成员变量的类型NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];并将该类型转为class,
    Class modelClass = NSClassFromString(type);再来递归调用。
  • 如果value是数组,就需要了解该数组中装的到底是什么类型的变量,在分类中需要定义协议

    1
    2
    3
    @protocol ModelDelegate <NSObject>
    +(NSDictionary*)objectClassInArray;
    @end
  • 并在成员变量包含数组的类中实现协议方法

    1
    2
    3
    4
    5
    6
    7
    + (NSDictionary *)objectClassInArray
    {
    return @{
    @"statuses" : @"SugarStatues",
    @"ads" : @"SugarADs",
    };
    }
  • 得到当前key对应的数组中变量的类型(得到的string要转化成class类型),遍历数组中的成员,将字典转为模型。

    DEMO

    Demo链接地址

最新文章

  1. 服务端跨域处理 Cors
  2. 图解call、apply、bind的异同及各种实战应用演示
  3. UVa 458 - The Decoder
  4. 【html/css】html/css命名规范
  5. 让linux中的程序崩溃时生成core文件
  6. MySQL 数据库发展历程及缺点
  7. Asp.net从文件夹中读取图片,随机背景图
  8. 1.MySQL的安装(linux Ubuntu环境下)
  9. java io 文件操作
  10. 10 - 删除vtkDataObject中的Update Extent方法 VTK 6.0 迁移
  11. No2_2.接口继承多态_Java学习笔记_继承
  12. jquery的选项卡事件
  13. boost xpressive 例子
  14. HDU 1434 幸福列车(优先队列)
  15. springboot 1.5.2 集成kafka 简单例子
  16. 通俗语言解释内外网IP与端口映射
  17. 网络1711-1712的C语言作业总结(2017-2018第一学期)
  18. windows下ruby中显示中文的3种方法
  19. l类与对象课后作业
  20. eclipse工作区(workspace)常用设置(preferences)

热门文章

  1. C语言笔记 16_标准库&amp;stdio&amp;stdlib&amp;string&amp;time
  2. 如何决定 Web 应用的线程池大小
  3. iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;
  4. Spring集成MyBatis配置文件
  5. 设计函数f(f(n))== -n
  6. maven隐含依赖
  7. Crowd Control
  8. PAT甲级——1025 PAT Ranking
  9. kubernets轻量 contain log 日志收集技巧
  10. spring cloud关于feign client的调用对象列表参数、设置header参数、多环境动态参数试配