iOS Kit内存,蓝牙优化当面iOS开发·内存相关

iOS开发 内存管理

2021-01-17  本文已影响0人  喜剧收尾_XWX

一、内存五大区

内存五大区

二、内存管理方案

iOS操作系统是针对不同场景,会提供不同的内存管理方案,
  1. TaggedPointer
  1. NONPOINTER_ISA
  1. 散列表Side Tables

原文链接

三、散列表Side Tables

散列表Side Tables是由多个Side Table组成,每个Side Table是由自旋锁、引用计数表、弱引用表组成。

四、信号量与自旋锁的区别

五、ARC、MRC

如果说一个对象有weak指针指向它,当这个对象dealloc或者废弃之后,它的weak指针为何会被自动置为nil?

六、__weak


//使用__weak关键字修饰的obj1变量指向一个通过alloc分配的一个对象obj,此时有了__weak弱引用指针
 
{
   id __weak obj1 = obj;
}
 
               |  代码块经过编译之后变成下面
               |
{
   id obj1;
   objc_initWeak(&obj1,obj); //实际上是使用objc_initWeak函数,传递了两个参数(弱引用变量的地址,被修饰的对象)

1. 一个weak变量是怎样被添加到弱引用表当中的?
2.当一个对象被废弃/释放之后,weak变量是如何处理的?

https://blog.csdn.net/ochenmengo/article/details/105045497

七、AutoreleasePool

1.viewDidLoad中通过NSMutebleArray的array类方法创建数组对象,这个array对象的内存是在什么时机释放的?
2.autoreleasepool{}在编译器的内部实现
//在autoreleasepool中的所有对象,都会添加到自动释放池中,当进行pop之后, autoreleasepool中所有对象都会被发送一次release消息
@ autoreleasepool {
  //AutoreleasePoolPage是C++类,调用它里面的push方法
    void *ctx = objc_autoreleasePoolPush(){
        void *objc_autoreleasePoolPush(void)
                                |
        void *AutoreleasePoolPage::push(void)
     };
 
//调用AutoreleasePoolPage中的pop函数,一次pop实际上相当于一次批量的pop操作
    objc_autoreleasePoolPop(ctx){
        void objc_autoreleasePoolPop(void *ctxt)
                                  |
        AutoreleasePoolPage::pop(void *ctxt)
    };
}

https://blog.csdn.net/ochenmengo/article/details/105069297

八、循环引用

https://blog.csdn.net/ochenmengo/article/details/105092499

上一篇下一篇

猜你喜欢

热点阅读