2015-06-02 5 views
4

Должен ли я постоянно объявлять слабые ссылки на прерывание циклов удержания блоков внутри блоков?Сохранять циклы для блоков внутри блоков

__weak typeof(self) weakSelf = self; 
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    typeof(self) strongSelf = weakSelf; 
    [strongSelf doSomething]; 
    [strongSelf setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     //do I need to create another weak reference to strongSelf for this block? 
     [strongSelf doSomething]; 
    }]; 
}]; 
+2

блоки могут использовать диапазон переменных из функции, в которой они определены, в вашем случае вы можете использовать weakSelf внешнего блока во внутреннем блоке, не создавайте другого weakSelf –

+2

. Кстати, вы делаете слабые стороны, сильный танец. Вам также нужно проверить, является ли 'strongSelf' нулевым. В этом случае это не имеет никакого значения, но в целом это хорошая идея. – matt

+0

@matt Каков правильный способ сделать слабый сильный танец? –

ответ

6

Боюсь, что так. [strongSelf setMyBlock:<inner block>] приведет к тому, что self сохранит внутренний блок. Если внутренний блок имеет сильную ссылку на self, это цикл. Тот факт, что переменная strongSelf была назначена от a __weak квалифицированная переменная изначально не имеет значения.

Как и некоторые другие пользователи, вы можете использовать оригинал weakSelf вместо того, чтобы создавать новый. Причина, по которой вы создаете ссылку strongSelf в блоке, заключается в том, что иначе self может быть освобожден во время работы блока. strongSelf будет либо в конечном итоге nil (если self был освобожден до назначения strongSelf, но это не причинило вреда), иначе self будет не быть освобожденным во время выполнения блока, потому что у вас есть сильная ссылка. В то время, когда у вас есть сильная ссылка на self, оригинал weakSelf является также безопасным в использовании, потому что self не будет освобожден.

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