0

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

Так что, если бы я это сделать:

__weak Employee *weakSelf = self; 
myBlock = ^{ 
    NSLog(@"%@", weakSelf); 
} 

Итак, блок имеет слабую ссылку на объект, но, мол, это хорошая практика, чтобы создать сильную локальную ссылку на себя внутри блока в случае объект, на который указывает себя, освобождается.

__weak Employee *weakSelf = self; 
myBlock = ^{ 
    Employee *innerSelf = weakSelf; 
    NSLog(@"%@", innerSelf); 
} 

Я хотел бы знать, и убедиться, что я понимаю правильно, поэтому я нарисовал картину того, что я думаю, что происходит (если я ошибаюсь, поправьте меня): enter image description here

Или это правильно: enter image description here

Исправленный визуал был бы очень признателен.

ответ

0

Ни один из них не является правильным.

Здесь всего два объекта. Объект Employee. И блок. Вот и все.

Вы не показали, что myBlock объявлен, но при условии, что это переменная экземпляра Employee, то да, это назначение, то Employee объект имеет сильную ссылку на блок.

Блок имеет слабую ссылку на Employee объекта, так как он захватывает локальную переменную weakSelf из окружающего объема, и, захватив ее, она делает неявное «переменную экземпляра» в блоке, который имеет характеристики управления же памяти как захваченная переменная (в данном случае слабая).

strongSelf внутри блока не имеет отношения к делу. Это всего лишь локальная переменная. Локальные переменные не являются переменными экземпляра, поэтому они не являются частью одного объекта, ссылающегося на другое. Локальные переменные сохраняются только в течение определенного времени вызова функции. Они не вызывают циклов.

Причиной innerSelf было так, что объект указал (от weakSelf, который является тем же объектом, на который указывает self и innerSelf) не высвобождены в середине функции. Это только проблема, если вы собираетесь использовать weakSelf несколько раз в функции и полагаться на состояния с тех времен, чтобы быть последовательными. Используя innerSelf, он будет последовательно указывать на существующий объект или постоянно nil. Поскольку вы используете только weakSelf один раз здесь, это не обязательно.

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