1.宏定义
#define # ##
a. 后面一个#是转成字符串
b. 后面## 是连接的作用
2. __attribute__
常用的 __attribute__(( constructor/destructor ))
若函数被设定为constructor属性,则该函数会在+load()后, main()函数执行之前被自动的执行.
若函数被设定为destructor属性,则该函数会在 main()函数执行之后被自动的执行.
更多了解:https://www.jianshu.com/p/cefcc59e7155
https://www.cnblogs.com/alantu2018/p/8465919.html
3. _dyld_register_func_for_add_image
链接:
https://www.jianshu.com/p/1de663f64c05
https://www.jianshu.com/p/9c909acd8ea2
https://www.jianshu.com/p/625a61dfe039
4. void* 与 id
a. void *在C语言中用来表示 “不确定类型指针”.
(1)void *可以接受任何类型的赋值;
(2)void *可以赋值给任何类型的变量 但是需要进行强制转换;
b. id类型用于隐藏对象类型的类名部分,相当于C语言中的“void *”。但是id本身就是一个指针,而且可以指向任何一个继承了Object(或者NSObject)类的对象 .
c. void* 与 id转换
//会crash void * test = (__bridge void *)([[NSObject alloc] init]); id test2 = (__bridge id) test; //正确转换方式 void * test = (__bridge_retained void *)([[NSObject alloc] init]); id test2 = (__bridge_transfer id) test;
因为void *的__bridge转换安全性比较低,如果管理时不注意赋值对象的所有者,很可能会因悬垂指针而导致程序崩溃。所以,我们需要通过“__bridge_retained”和“__bridge_transfer”进行转换。
5. dlopen、dlsym和dlclose的使用