3

Обычно ссылки weak используются, чтобы избежать удержания циклов в графе объектов приложения. Я понимаю эту часть. Теперь я хотел бы сделать еще один шаг и понять, как они работают под капотом.Что происходит с __weak квалифицированными переменными под капотом?

Поиск немного, я читал, что, когда я использую квалификатор __weak, переменная, связанная с этим квалификатором, регистрируется в пуле автоопределений, но что это значит? Почему объект зарегистрирован в пуле? Какой тип пула используется? Это основной пул или какой-то другой специально созданный?

Когда я использую этот код:

id _weak myWeakObj = [[NSObject alloc] init]; 

компилятор дает мне предупреждение, что я могу исправить с:

id _strong myStrongObj = [[NSObject alloc] init]; 
id _weak myWeakObj = myStrongObj; 

Таким образом, на основе предыдущего вопроса, что происходит с объектом ссылочного от myStrongObj? Если возможно, я хотел бы узнать, как выглядит код компилятора?

+1

Фактический промежуточный этап (пост-ARC) на самом деле недоступен в качестве источника. Вам нужно будет посмотреть на ассемблер, чтобы увидеть сохраненные и выпущенные версии. Это довольно приятный вопрос! –

+1

Где вы узнали об авторешетке и __weak? Это не так. В основном это выполняется в режиме выполнения Objective-C. Я постараюсь кратко сформулировать короткий ответ ... – mattjgalloway

+0

@JacquesCousteau Спасибо, что выбрали и исправили заголовок. Как можно увидеть сохранение и выпуск в ассемблере? Благодарю. –

ответ

5

Следующая ваш друг:

А также источник для выполнения Objective-C:

В частности, взглянуть т:

Если посмотреть на objc_initWeak и objc_destroyWeak как на 1-й линии переговоров о тогда вы увидите, как это работает «под капотом». Кисты находятся в weak_register_no_lock для регистрации слабой ссылки и в weak_unregister_no_lock для отмены регистрации слабой ссылки.

Я оставлю это вам, чтобы пройти через все его тонкости фактически работает :-).

+0

+ 1 для вашей поддержки. –

+0

Итак, когда я использую '_weak', пул авторезистов не задействован, это правда? Или, может быть, есть шанс, что компилятор добавит магическую инструкцию, которая ее создает? С ** Это не так, вы ссылаетесь на мой фрагмент кода? –

+2

Пулы автореферата не имеют отношения к '__weak'. Да, возможно, в игре есть пул авторефератов.Infact, когда вы загружаете слабую ссылку (см. 'Objc_loadWeak'), она сохраняет и автореализует объект, например. Но вам не нужно беспокоиться о пуле авторефератов здесь - он не имеет никакого отношения к тому, как работает переменная '__weak'. – mattjgalloway

Смежные вопросы