一些语法

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

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链接地址

Runtime常见使用的更多相关文章

  1. iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...

  2. iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...

  3. Runtime常用的几个应用场景

    Runtime常见的几个应用场景. Runtime常见应用场景 具体应用拦截系统自带的方法调用(Method Swizzling黑魔法) 实现给分类增加属性 实现字典的模型和自动转换 JSPatch替 ...

  4. runtime机制

    runtime(简称运行时),是一套 纯C(C和汇编写的) 的API.而 OC 就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 消息机制原理:对象根据方法编号SEL去映射表查找对 ...

  5. Objective-C runtime的常见应用

    用Objective-C等面向对象语言编程时,"对象"(object)就是"基本构造单元"(building block).开发者可以通过对象来存储并传递数据. ...

  6. Java常见异常(Runtime Exception )小结(转)

    原文链接:Java常见异常(Runtime Exception )小结 Java异常体系结构呈树状,其层次结构图如图 1所示:           本文重在Java中异常机制的一些概念.写本文的目的在 ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载

    ArcGIS Runtime SDK for Android 支持多种类型空间数据源.每一种都提供了相应的图层来直接加载,图层Layer是空间数据的载体,其主要继承关系及类型说明如下图所示: 转载请注 ...

  8. iOS runtime实用篇解决常见Crash

    程序崩溃经历 其实在很早之前就想写这篇文章了,一直拖到现在. 程序崩溃经历1 平时开发测试的时候好好的,结果上线几天发现有崩溃的问题,其实责任大部分在我身上. 我的责任: 过分信赖文档,没进行容错处理 ...

  9. Runtime简介以及常见的使用场景(此内容非原创,为转载内容)

    Runtime简称运行时,是一套比较底层的纯C语言的API, 作为OC的核心,运行时是一种面向对象的编程语言的运行环境,其中最主要的是消息机制,Objective-C 就是基于运行时的. 所谓运行时, ...

随机推荐

  1. python-django项目-Linux系统建立django项目_20191117

    python-django项目-Linux系统建立django项目 1,Linux系统下面,cd /usr/local/lib/  看这个下面会有两个python版本,一个2.7,一个3.5,我们使用 ...

  2. AJAX数据传输(原生js)

    原生ajax写法 <!DOCTYPE html> <html lang=""> <head> <meta charset="UT ...

  3. Linux 杀死进程方法大全(kill,killall)

    杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志.   首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:   # kill -pid   注释:标准的kill命令通常 ...

  4. 2)echo count(strlen("test")) 的输出为____

    结果是  1: 因为count测的是单元的数目,你的一个数组就是一个单元,所以 他的结果就是1 题目出处: https://www.nowcoder.com/test/question/done?ti ...

  5. python项目中对mysql数据库进行配置,并进行连接测试

    在settings.py中配置mysql数据库进行相关配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME ...

  6. vue表格业务

    https://www.jianshu.com/p/79f39f2c1382 https://blog.csdn.net/zhongshijun521/article/details/78390614 ...

  7. 用Spring Tool Suite简化你的开发

    如果你是一个喜欢用spring的人,你可能会在欣赏spring的强大功能外,对其各样的配置比较郁闷,尤其是相差较大的版本在配置文件方面会存在差异,当然你可以去花不少的时间去网上查找相关的资料,当你准备 ...

  8. OSI体系结构(七层)

    OSI体系结构,意为开放式系统互联.国际标准组织(国际标准化组织)制定了OSI模型.这个模型把网络通信的工作分为7层,分别是物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 1至4层被认为 ...

  9. Centos7下常见命令

    1:  hostnamectl set-hostname  oldgirl   设置主机名直接生效 2:  hostname oldboy   (暂时生效,重启后恢复原来主机名)

  10. SQL Server 查询分析器的执行计划中的扫描方式,举例理解

    student表,id,name,address id上建立聚集索引,Name建索引,address无索引.1. [Table Scan]:遍历整个表,查找所有匹配的记录行.这个操作将会一行一行的检查 ...