关于释放本地变量的顺序

时间:2019-07-04 07:50:06

标签: objective-c

共有四个类别:

@implementation AClass

- (void)dealloc {
    NSLog(@"a");
}

@end

@implementation BClass

- (void)dealloc {
    NSLog(@"b");
}

@end

@implementation CClass

- (void)dealloc {
    NSLog(@"c");
}

@end

@implementation DClass

- (void)dealloc {
    NSLog(@"d");
}

@end

现在进行测试:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    AClass *a = [AClass new];
    NSLog(@"1");
    BClass *b = [BClass new];
    NSLog(@"2");
    [CClass new];
    NSLog(@"3");
    [DClass new];
    NSLog(@"4");
}

控制台显示:

1 2 c 3 d 4 b a

问题:

为什么c d之前a b,为什么b之前a

2 个答案:

答案 0 :(得分:0)

c和d没有可变的强引用,因此它将在a,b之前释放(c,d在创建后释放)。 我认为ARC(自动引用计数)insert objc_release的汇编调用c,d在a,b之前。

关于b在a之前释放,我认为ARC将从底部到顶部释放变量。

您可以在viewDidLoad功能处设置断点,然后选择菜单Debug>Debug Workflow>Always show disassembly进行查看。

答案 1 :(得分:0)

Automatic Reference Counting

在编译代码时,ARC自动添加retain / release

在这种情况下,cd会立即释放,因为没有指向它们的强大指针。 ab的变量具有很强的指针,当这些变量超出范围时(在方法末尾),编译器将添加一个release调用。如果您将__weak用作变量之一,它将立即被取消分配。

发布的ab之间的顺序是ARC实施的详细信息,可能不明智,因为Clang不保证该顺序,因此可能会更改。 / p>