Нужно ли в параметрах блока указывать квалификаторы владения при предоставлении слабых ссылок?

Я пытаюсь использовать блоки таким образом, что я предоставляю ссылку на объект, который сохраняет блок, следующим образом:

typedef void(^RunBlock)(__weak Thing *block_owner, ThingFinishBlock finish);

где Thing имеет свойство run_block типа RunBlock.

Thing *thing = [Thing thingWithBlock^(Thing *owner, ThingFinishBlock finish) { ... }];

Вызов run_block из Thing происходит примерно так:

__weak typeof(self) this = self;
_finish_block = ^(){ ... }
self.run_block(this, _finish_block);

Итак, мне интересно, безопасно ли определять первый параметр run_block Thing *owner без префикса __weak, или это вызовет зацикливание? Я не уверен, так как указатель уже определен как __weak в typedef, а данный параметр уже __weak.

^(__weak Thing *owner ...){ ... }

В отличие от

^(Thing *owner, ...) { ... }

Спасибо!


person Goos    schedule 17.06.2013    source источник


Ответы (1)


Нет, __weak в параметрах не является частью самого типа функции.

typedef void(^RunBlock)(__weak Thing *block_owner, ThingFinishBlock finish);

такой же как

typedef void(^RunBlock)(Thing *block_owner, ThingFinishBlock finish);

Именно там вы реализуете блок, для которого значение __weak в параметре имеет значение.

Кроме того, я понятия не имею, почему вы думаете, что это как-то связано с сохранением циклов.

person newacct    schedule 27.06.2013