Для случая 1 переменная test
является просто параметром локальной функции, блок не сохранил никаких других переменных извне.
Для случая 2 объект testMember
происходит изблок снаружи при определении блока, блок сохраняет свой счетчик ссылок.Поскольку testBlock
определяется как свойство класса TestClass
, то testMember
принадлежит testBlock
.Итак, testMember
и testBlock
сохраняют друг друга, то есть циклические ссылки .
Чтобы исправить проблему циклического сохранения в случае 2, используйте это:
__weak TestObject *weakMember = testMember;
testMember.testBlock = ^(TestClass *test) {
__strong TestObject *strongMember = weakMember;
NSLog(@"%@", strongMember);
};
Поскольку переменная weakMember
не увеличивает счетчик ссылок реального объекта testMember
, то же самое произошло и с testBlock
.При запуске выполнения testBlock
, strongMember
пытается сохранить объект weakMember
(который может получить значение nil, зависит от вашей логической схемы) и уменьшить счетчик ссылок при завершении блока.