一些语法

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

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 virtualenv

    我正在使用virtualenv和virtualenvwrapper. 我可以使用workon命令在virtualenv之间切换. me@mymachine:~$ workon env1 (env1)m ...

  2. python常见内置函数总结

    简单的内置函数 len    求长度 min   求最小值 max  求最大值 sorted  排序 reversed   反向 sum   求和 进制转换 bin   转为二进制 oct   转为八 ...

  3. 【shell】概述

    功能简介 批量自动初始化系统(update,软件安装,时区设置,安全策略...) 批量自动部署软件(LAMP,LNMP,Nginx,LVS,Tomcat) 管理应用程序(KVM,集群管理扩容,MySQ ...

  4. HEX 文件格式

    例 FDFFF885C3 :每行开头 第一个字节:表示本行的数据长度, 第二个,第三个字节表示本行数据的起始地址. 第四字节表示数据类型,数据类型有:0x00.0x01.0x02.0x03.0x04. ...

  5. 2019-2020-1 20199324《Linux内核原理与分析》第四周作业

    第三章 MenuOs的构造 一.知识点总结 计算机的三大法宝: 存储程序计算机 函数调用堆栈 中断 操作系统的两把宝剑: 中断上下文的切换(保存现场和恢复现场) 进程上下文的切换 它们都和汇编语言有着 ...

  6. D. Array Splitting(后缀数组)

    You are given an array

  7. The General Addition Rule|complementation rule|special addition rule|

    5.3 Some Rules of Probability 如图所示,AorB是所有蓝色区域,所以P(AorB)=PA+PB,但是若非互斥事件,则不能直接相加: If you think of the ...

  8. Xcode查看iOS崩溃与崩溃日志分析

    一.造成崩溃的原因 1.代码中存在bug 2.Watchdog 超时机制 3.用户强制退出 4.低内存终止 5.其他违法系统规则的操作,大部分是内存问题 二.崩溃的类型 1.信号错误类 (1)EXC_ ...

  9. 三角插值的 Fourier 系数推导

    给定 $k$ 个互不相同的复数 $x_0,\cdots,x_{k-1}$,以及 $k$ 个复数$y_0,\cdots,y_{k-1}$.我们知道存在唯一的复系数 $k-1$ 次多项式$$\mathca ...

  10. [LC] 429. N-ary Tree Level Order Traversal

    Given an n-ary tree, return the level order traversal of its nodes' values. Nary-Tree input serializ ...