2013-02-27 3 views
0

Из того, что я понял, можно сделать доступный объект между блоками (и очередями?) С помощью модификатора __block.Пропуск типов значений между блоком

-(void)performRequest: (void (^)(NSArray* outcome))completion 
{ 
    dispatch_async(dispatch_get_global_queue(0,0), ^{ 
       // do some request 

      __block NSArray * result = [[NSArray alloc]init]; //Outcome of the request. 

      completion(result); 
     }); 
} 

Давайте предположим, что блок завершения будет dispatch_async на главном потоке

Я предполагаю, что это должно быть возможно сделать это с типами значений без идентификатора __block. Я прав?

-(void)performRequest: (void (^)(int outcome))completion 
{ 
    dispatch_async(dispatch_get_global_queue(0,0), ^{ 
      // do some request 

     int result = 10; //Outcome of the request. 

     completion(result); 
    }); 
} 
+0

Как ваш пример 1 и 2 похожи? В первом случае любое изменение результата 'result' будет отображаться на' result'. Во втором вы передаете '10' непосредственно в блок. 'result' не будет изменен вообще, независимо от того, что вы делаете в блоке завершения. – iDev

+0

@ABC - Отредактированный вопрос – johan

+0

Вам необходимо проверить http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html – iDev

ответ

2

Использование __block в вашем первом фрагменте кода совершенно бессмысленно.

Вся цель __block заключается в том, чтобы значение оставалось изменяемым при захвате в другом блоке. Вы не захватываете result в любом месте.

Обратите внимание, что в соответствии с MRR __block имеет побочный эффект от предотвращения блокировки блока захвата, что делает его часто используемым способом для нарушения цикла удержания. В ARC это неверно. Если вам нужно избегать цикла сохранения, вам необходимо использовать значение __unsafe_unretained или __weak. Тем не менее, все это не относится к вашему представленному фрагменту кода.

+0

Хорошо. Таким образом, без __блока это было бы неизменным в других блоках? Что если он был захвачен другой очередью (скажем, это переменная экземпляра) – johan

+0

@johan: '__block' влияет только на переменную. Он не меняет базовое значение. Если вы передадите переменную 'result'' '' __block 'result' в другую функцию,' __block' будет отброшена. Это точно так же, как если бы вы назначили его другой переменной. –

+0

@johan: Поэтому, если эта явная * переменная * не будет захвачена другой очередью, '__block' не имеет смысла. –

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