Ответ 1
Вам нужно использовать эту строку кода для решения вашей проблемы:
__block Person *aPerson = nil;
Подробнее см. в этом руководстве: Блоки и переменные.
Я получаю сообщение об ошибке
Переменная не назначается (отсутствует спецификатор типа __block)
на линии aPerson = participant;
. Как я могу убедиться, что блок может получить доступ к переменной aPerson
, а переменная aPerson
может быть возвращена?
Person *aPerson = nil;
[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
Person *participant = (Person*)obj;
if ([participant.gender isEqualToString:@"M"]) {
aPerson = participant;
*stop = YES;
}
}];
return aPerson;
Вам нужно использовать эту строку кода для решения вашей проблемы:
__block Person *aPerson = nil;
Подробнее см. в этом руководстве: Блоки и переменные.
Просто напоминание об ошибке, которую я сделал сам,
__block
объявление должно выполняться при первом объявлении переменной, то есть ВНЕШНЕГО блока, а не внутри него. Это должно устранить проблемы, упомянутые в комментариях о переменной, не сохраняющей ее значение вне блока.
Просто используйте префикс __block
для объявления и назначения любого типа переменной внутри блока.
Например:
__block Person *aPerson = nil;
__block NSString *name = nil;
Чтобы назначить переменную внутри блока, которая вне блока всегда использует спецификатор __block перед этой переменной, ваш код должен выглядеть следующим образом: -
__block Person *aPerson = nil;
__block Person *aPerson = nil;
Попробуйте __weak
, если вы получите предупреждение о сохранении цикла, используйте __block
Person *strongPerson = [Person new];
__weak Person *weakPerson = person;
Теперь вы можете ссылаться на объект weakPerson
внутри блока.
да блок - самая используемая функциональность, поэтому, чтобы избежать цикла сохранения, мы должны избегать использования сильной переменной, в том числе внутри внутри блока, воодушевить использование слабой или слабой стороны.
Я тоже сделал себя,
__block
объявление должно выполняться при первом объявлении переменной, то есть ВНЕШНЕГО блока, а не внутри него. Это должно устранить проблемы, упомянутые в комментариях о переменной, не сохраняющей ее значение вне блока.
__block Person *aPerson = nil;
Когда я увидел ту же ошибку, я попытался устранить ее следующим образом:
__block CGFloat docHeight = 0.0;
[self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
//height
NSLog(@"=========>document.height:@%@",height);
docHeight = [height floatValue];
}];
и работает нормально
Просто добавьте __block перед переменной.