前言
YYClassInfo
该文件中定义了四个类,要了解这四个类我们需要了解一些runtime
的知识。
YYCLassInfo
下面介绍一下YYCLassInfo
中关类的相关理解。
-
YYClassIvarInfo
该类对应描述的是实例变量(ivar),包含相关的信息ivar结构体、名字、偏移量、类型编码、类型。
初始化方法- (instancetype)initWithIvar:(Ivar)ivar;
主要是实现ivar实例变量与YYClassIvarInfo的转化。 -
YYClassMethodInfo
类中方法相关的信息,包含方法(Method)、名字、sel、imp、类型编码、返回值类型编码、参数类型编码。
初始化方法- (instancetype)initWithMethod:(Method)method;
实现了结构体Method
到YYClassMethodInfo
的转化 -
YYClassPropertyInfo
属性相关的信息,包含objc_property_t结构体、属性名、类型、类型编码、实例变量(ivar)名、类等。
初始化方法- (instancetype)initWithProperty:(objc_property_t)property;
实现了objc_property_t
到YYClassPropertyInfo的转化 -
YYClassInfo
类相关的信息,包含YYClassIvarInfo
、YYClassMethodInfo
、YYClassPropertyInfo
等。
- (void)setNeedUpdate
当类发生了变化时需要调用该方法以更新缓存中类的相关信息。调用该方法后方法- (BOOL)needUpdate;
会返回YES表示你可以使用+ (nullable instancetype)classInfoWithClass:(Class)cls
或者+ (nullable instancetype)classInfoWithClassName:(NSString *)className
方法回去更新后的类的信息。也可以使用这两个方法初始化YYClassInfo
。
拓展
-
NS_OPTIONS
和NS_ENUM
NS_ENUM
一般用于通用枚举
NS_OPTIONS
一般用于定义位移枚举,使用一个变量保存多个枚举值时。
举个例子如系统中UIViewAutoresizing的定义如下:
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,//0000 0001
UIViewAutoresizingFlexibleWidth = 1 << 1,//0000 0010
UIViewAutoresizingFlexibleRightMargin = 1 << 2,//0000 0100
UIViewAutoresizingFlexibleTopMargin = 1 << 3,//0000 1000
UIViewAutoresizingFlexibleHeight = 1 << 4,//0001 0000
UIViewAutoresizingFlexibleBottomMargin = 1 << 5//0010 0000
}; // 赋值
要实现视图的宽高自适应一般如下定义:
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
转换为二进制计算:
IViewAutoresizing resizing = 0000 0010 | 0001 0000;
这样就实现了变量保存多个枚举值。那么如何判断变量是否包含某个枚举值了,这的通过与操作。比如我要判断是否包含了UIViewAutoresizingFlexibleWidth
if (resizing & UIViewAutoresizingFlexibleWidth) {
// UIViewAutoresizingFlexibleWidth is set
}
对应的二进制:
if (00010010 & 00000010) {
}
00010010 & 00000010很明显不等于0,所以返回的事YES。那么用不包含的试一下。
if (resizing & UIViewAutoresizingFlexibleLeftMargin) {
}
对应的二进制:
if (00010010 & 0000 0001) {
}
可以看出00010010 & 0000 0001 = 0,所以能够知道resizing不包含UIViewAutoresizingFlexibleLeftMargin
通过以上的这种方式实现了一个变量保存多个枚举值。也就是NS_OPTIONS的原理。
网友评论