Я работаю над проектом Objective-C, и у нас включен ARC.В настоящее время я имею дело с двумя отдельными классами, давайте назовем их A
и B
.
A
имеет строгую ссылку на B
, а B
имеет свойство блока с атрибутом copy
.
@interface A {
B *b;
...
}
@end
@interface B {
...
}
@property (copy) void (^myBlock)();
@end
Теперь, если внутри метода принадлежит A
Я пытаюсь присвоить myBlock
:
b.myBlock = ^{ [self doSomething] };
Компилятор (правильно) жалуется:
Сильный захват self в этом блоке можетпривести к циклу сохранения.
Я понимаю это поведение и как его обойти, основываясь на ответах на на этот вопрос .(По сути, цикл формируется, потому что после того, как блок скопирован, он будет содержать сильную ссылку на A
, которая имеет сильную ссылку на B
, которая, в свою очередь, имеет сильную ссылку на сам блок.)
Теперь, если вместо непосредственного присвоения блока свойству я передаю его методу B:
[b takeMyBlock:^{ [self doSomething] }];
И внутри этого метода я делаю присваивание, компилятор больше не будет жаловаться.
Мой вопрос: это создаст утечку памяти?Если так, как этого избежать?Можно ли как-то аннотировать аргумент метода, чтобы компилятор знал, что аргумент будет скопирован?
Заранее спасибо.