Приказ о выпуске местного вар - PullRequest
0 голосов
/ 04 июля 2019

Существует четыре класса:

@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 голосов
/ 04 июля 2019

Автоматический подсчет ссылок

ARC автоматически добавляет retain / release при компиляции кода.

В этом случае c и d выпущены сразу, так как на них нет сильных указателей.a и b имеют сильные указатели на свои переменные, и компилятор добавит вызов release, когда эти переменные выйдут из области видимости (в конце метода).Если вы используете __weak для одной из переменных, она будет сразу же освобождена.

Порядок между освобождаемыми a и b является подробностью реализации ARC, и, вероятно, это не так.разумно полагаться на него, поскольку Clang не дает никаких гарантий относительно порядка, поэтому он может потенциально измениться.

0 голосов
/ 04 июля 2019

c и d не имеют сильной ссылки на переменную, тогда она будет освобождена до a, b (c, d Release после создания). Я думаю ARC (Автоматический подсчет ссылок) insert objc_release вызов сборки c, d перед a, b.

О выпуске b перед a, я думаю, ARC выпустит переменную снизу вверх.

Вы можете установить точку останова на viewDidLoad функцию и выбрать меню Debug>Debug Workflow>Always show disassembly, чтобы увидеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...