自动引用计数

什么是自动引用计数

内存管理中对引用采取自动计数的技术

内存管理

  • 自己生成的对象,自己所持有
    • alloc
    • new
    • copy
    • mutableCopy
  • 非自己生成的对象,自己也能持有
    • retain
  • 不再需要自己持有的对象时释放
    • release
  • 非自己持有的对象无法释放

  • 废弃对象

    • dealloc

__strong

__strong 修饰符表示对对象的“强引用”

__unsafe_unretained 修饰符

__unsafe_unretained 是不安全的所有权修饰符, 被它修饰的变量不属于编译器的内存管理对象

1
id __unsafe_unretained objc = [[NSObject alloc] init];

Xcode 提示:Assigning retained object to unsafe_unretained variable; object will be released after assignment

将保留对象赋给unsafe_unretain变量;对象将在赋值后释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
id __unsafe_unretained obj1 = nil;

{
id __unsafe_unretained obj = [[NSObject alloc] init];

// 自己生成并持有对象
// 因为obj0 变量是__strong,强引用,所以自己持有对象
id __strong obj0 = [[NSObject alloc] init];

// obj0 变量赋值给你obj1
// ojb1 变量不持有对象的强应用,也不持有弱引用
obj1 = obj0;


// 输出 obj1 变量表示的对象
NSLog(@"A: %@", obj1);
} // obj0变量 超出了其作用域,强引用失效自动释放自己持有的对象,除此之外没有其他持有者,所以废弃该对象




// 输出 obj1 变量表示的对象
// obj1 变量表示的对象因为无持有者已经销毁,坏的内存访问
NSLog(@"B: %@", obj1);