iOS知识点整理

时间:2021-10-23 08:28:54

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的使用