iOS 开发 Objective-C

iOS 底层 day26 内存管理 引用计数器 weak指针

2020-09-24  本文已影响0人  望穿秋水小作坊

一、引用计数器

1. 引用计数器(retainCounter)保存在哪里

二、__weak 指针

1. __weak__strong__unsafe_unretained 有什么区别?
2. __weak__strong__unsafe_unretained 可以从代码的角度感受他们的不一样(打开 Zombie Objects);
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        __strong Person *person1;
        __weak Person *person2;
        __unsafe_unretained Person *person3;
        NSLog(@"begin");
        {
            Person *person = [[Person alloc] init];
            person1 = person;
//            person2 = person;
//            person3 = person;
        }
        NSLog(@"%@",person1);
//        NSLog(@"%@",person2);
//        NSLog(@"%@",person3);
        NSLog(@"end");
    }
    return 0;
}
3. __weak 指针在什么时候被置为nil?
weak_clear_no_lock

三、autorelease 自动释放池

1. 我们经常可以在 main 函数中看到 @autoreleasepool,这明显是一个编译器的语法糖,思考碰到这种语法糖,我们如何让它原形毕露?
转换后的 main 代码 __AtAutoreleasePool 结构体 main 函数的实际代码效果
2. objc_autoreleasePoolPush()objc_autoreleasePoolPop(atautoreleasepoolobj) 这两个函数干了什么?
3. AutoreleasePoolPage 的理解
AutoreleasePoolPage结构体的内部成员变量
4. AutoreleasePoolPage 的图解
AutoreleasePoolPage双向列表图解
5. 思考 MRC 环境下,下列代码在 AutoreleasePoolPage的存储情况
示例代码 存储结构情况
objc[7180]: ##############
objc[7180]: AUTORELEASE POOLS for thread 0x1000d3dc0
objc[7180]: 7 releases pending.
objc[7180]: [0x10280e000]  ................  PAGE  (hot) (cold)
objc[7180]: [0x10280e038]  ################  POOL 0x10280e038
objc[7180]: [0x10280e040]       0x100637410  Person
objc[7180]: [0x10280e048]       0x100637470  Person
objc[7180]: [0x10280e050]  ################  POOL 0x10280e050
objc[7180]: [0x10280e058]       0x100637970  Person
objc[7180]: [0x10280e060]  ################  POOL 0x10280e060
objc[7180]: [0x10280e068]       0x100637990  Person
objc[7180]: ##############
5. 请问MRC 环境下,下面的person 什么时候释放?
- (void)viewDidLoad {
    [super viewDidLoad];
    @autoreleasepool {
        YYPerson *person = [[[YYPerson alloc] init] autorelease];
    }
    NSLog(@"%s", __func__);
}
6. 请问MRC 环境下,下面的person 什么时候释放?
- (void)viewDidLoad {
    [super viewDidLoad];
    YYPerson *person = [[[YYPerson alloc] init] autorelease];
    NSLog(@"%s", __func__);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"%s", __func__);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"%s", __func__);
}

四、ARC为我们做了什么?

1. ARC 为我们自动添加 release
main(){
    id a;
}
2. ARC 为我们自动添加 retain
main(){
    id a;
    __strong id b = a;
}
3. 在 ARC 的环境下,下面 person 在什么时候释放?
- (void)viewDidLoad {
    [super viewDidLoad];
    YYPerson *person = [[YYPerson alloc] init] ;
    _objc_autoreleasePoolPrint();
    NSLog(@"%s", __func__);
}
4. ARC为我们做了什么?参考资料。

http://luoxianming.cn/2017/05/06/arc/

上一篇 下一篇

猜你喜欢

热点阅读