Ну, во-первых:
Если (и только если) ваша причина, по которой вы избегаете использования self
или прямого доступа иваров внутри блока, действительно являются циклами сохранения, то вы должны быть в ситуации, подобной
client => objectA => blockWithWeakBackReference
(где =>
означает «имеет сильную ссылку на»).
В этом случае blockWithWeakBackReference
должен вызываться только с помощью objectA
, поэтому нет опасности плохого доступа.
Если я правильно понимаю ваш вопрос, вы на самом деле имеете в виду другой сценарий:
objectA
хочет, чтобы какая-то служба всего приложения выполняла блок от своего имени , если выполняется какое-то предварительное условие.
- Вы избегаете использования
self
внутри блока, потому что хотите иметь возможность утилизировать objectA
до выполнения блока.
Одним из примеров этого может быть общая сетевая очередь, которая выполняет блок по завершении загрузки запроса по той или иной причине.
В этом случае я бы предложил просто скопировать схему NSNotificationCenter
addObserverForName:object:queue:usingBlock:
и заставить ваш сервис реализовать пару методов, таких как -(SomeTokenObjectType)addWorkerBlock:(void(^)(whatever-signature-makes-sense-for-you))
и -(void)cancelWorkerBlockWithToken:(SomeTokenObjectType)
, чтобы поставить в очередь и отменить ваш обратный вызов. блоки.
Тогда все объекты, использующие этот сервис, могут просто иметь ивар типа NSMutableSet
для хранения токена для каждого блока в очереди и - в своих dealloc
- перечислять оставшиеся токены, отменяя их с помощью сервиса.