runtime学习
2018-07-31 本文已影响7人
06f43b0b52f7
美团技术团队iOS学习:https://tech.meituan.com/DiveIntoCategory.html
runtime学习网址:https://www.cnblogs.com/ioshe/p/5489086.html
首先从runtime的数据结构
1 SEL
- typedef struct objc_Selector *SEL
2 id
- typedef struct objc_object *id
- typedef struct objc_object{ class isa}
- 以上定义,看到 Objc_object 结构体包含一个isa指针,根据isa指针就可以找到对象所属的类
Class
- typedef struct objc_class *class;
Class super_class
const char *name
long version
long info
long instance_size
struct objc_ivar_list *ivars
struct objc_methodlist *methodList
struct objc_cache *cache
struct objc_protocol_list *protocols
objc_ivar_list结构体用来存储成员变量的列表 ,而objc_ivar 则是存储了单个成员变量的信息;同理objc_method_list结构体存储着方法数组的列表,而单个方法的信息则由objc_method结构体存储
objc_method 存储了方法名,方法类型,方法实现
- 方法名类型为 SEL
- 方法类型 method_types 是个char指针 ,存储方法的参数类型和返回值类型
- method_imp 指向了方法的实现,本质是一个函数指针
Ivar
- Ivar表示成员变量的类型
typedef struct objc_ivar *Ivar;
struct objc_ivar {
char *ivar_name
char *ivar_type
int ivar_offset//是基地址偏移字节
}
IMP
IMP在objc.h中的定义是:
typedef id(*IMP)(id,SEL,...);
它是一个函数指针
运行时学习
- class_copyPropertyList和class_copyIvarList的区别
内容
- class_copyPropertyList:
通过类名获得类的属性变量。
- class_copyIvarList
通过类名获得类的实例变量。
- 也就是说:
class_copyPropertyList获得的是由@property修饰过的变量,
class_copyIvarList获得的是class_copyPropertyList修饰的以及在m文件的中@implementation内定义的变量
eg:
//.h
@interface Model : NSObject
@property (nonatomic,copy) NSString *sex;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,strong) NSDictionary *imgCode;
@end
//.m
@interface Model ()
@property (nonatomic,copy) NSString *Id;
@end
@implementation Model {
NSInteger _index;
}
@end