yykit 是最近一个很火的开源框架,今天来研究看看yykit源码和一些原理,刚拿到yykit还是 很惊讶,来看看yykit 的目录,功能不仅强大,而且是十分全面的,我们来看看他的目录结构
不得不惊叹,真的好全面,一篇文章根本看不完,今天还是先从base 说起吧,
展开base 也是不少东西,先来看看这个头文件定义了什么吊炸天的东西
一开始看就尼玛就卡主了,
#ifdef __cplusplus
#define YY_EXTERN_C_BEGIN extern "C" {
#define YY_EXTERN_C_END }
#else
#define YY_EXTERN_C_BEGIN
#define YY_EXTERN_C_END
#endif
这是什么鬼啊,各种百度,google之后总算是有些眉目了
先看 #ifdef __cplusplus google 之后发现 c++中定义了__cplusplus,C语言中没有该定义。即这个是用来:识别是c代码还是c++代码
在看EXTERN_C ,调用extern "C"会让c++编译器按照c的编译格式来编译。多用于c++库的头文件。 也即是说这个在c++的环境下,会强制编译器用 C 语言的规则去编译,而不是用 C++ 语言的规则。。因为 C++ 为了实现函数重载会把函数名和参数等联合起来合成一个中介的函数名,如果 C 函数也被这样编译会出问题,所以在我看来这个是为了兼容c++环境不会编译报错。
好吧解决了这个 在往下看看有什么比较难理解的东西
接下来是一个两重判断的 宏定义
#ifndef YY_CLAMP // return the clamped value
#define YY_CLAMP(_x_, _low_, _high_) (((_x_) > (_high_)) ? (_high_) : (((_x_) < (_low_)) ? (_low_) : (_x_)))
#endif
咋一看不知道有什么用写成if else 语句大概是
if(x>high)
return high;
else
{
if(x<low)
return low;
else
return x;
}
好吧接下来往下看吧
#ifndef YY_SWAP // swap two value
#define YY_SWAP(_a_, _b_) do { __typeof__(_a_) _tmp_ = (_a_); (_a_) = (_b_); (_b_) = _tmp_; } while (0)
#endif
虽然这个一眼就看出来是个交换 函数还是有两个地方需要注意的为什么要用这个关键字呢typeof 还有为什么要用do while 直接用if else 不是就行了吗
百度一下你就知道
typeof(var) 是gcc对C语言的一个扩展保留字,用于声明变量类型,var可以是数据类型(int, char*..),也可以是变量表达式。也即是说 变量a 还可以是个变量表达式这里吊吊的
,但为啥要用do while 这里就请众大神指点迷津了。
就不一一解析,看一些比较特别的吧
#ifndef YYSYNTH_DUMMY_CLASS
#define YYSYNTH_DUMMY_CLASS(_name_) \
@interface YYSYNTH_DUMMY_CLASS_ ## _name_ : NSObject @end \
@implementation YYSYNTH_DUMMY_CLASS_ ## _name_ @end
#endif
这一段还是挺特别的, 但oc 编译静态库 要在build setting other linker flag设置 -all_load 和-Objc才可以将category 编进去
使用这段宏定义他可以虚拟新建一个与名字category 相同.h.m 让编译器 编译通过
但是每次要对所有category 都要申明这个的话可能会比较麻烦,直接加-all_load 据官方文档说,它可以使生成的可执行文件较大,并且产生一些不需要的文件
#ifndef YYSYNTH_DYNAMIC_PROPERTY_OBJECT
#define YYSYNTH_DYNAMIC_PROPERTY_OBJECT(_getter_, _setter_, _association_, _type_) \
- (void)_setter_ : (_type_)object { \
[self willChangeValueForKey:@#_getter_]; \
objc_setAssociatedObject(self, _cmd, object, OBJC_ASSOCIATION_ ## _association_); \
[self didChangeValueForKey:@#_getter_]; \
} \
- (_type_)_getter_ { \
return objc_getAssociatedObject(self, @selector(_setter_:)); \
}
#endif
//调用的方法
@interface NSObject (MyAdd)
@property (nonatomic, retain) UIColor *myColor;
@end
#import <objc/runtime.h>
@implementation NSObject (MyAdd)
YYSYNTH_DYNAMIC_PROPERTY_OBJECT(myColor, setMyColor, RETAIN, UIColor *)
@end
使用runtime 运行时属性 给catetory 动态添加属性