Присвойте переменную внутри блока переменной за пределами блока - PullRequest
372 голосов
/ 01 ноября 2011

Я получаю сообщение об ошибке

Переменная не присваивается (отсутствует спецификатор типа __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;

Ответы [ 7 ]

755 голосов
/ 01 ноября 2011

Вам необходимо использовать эту строку кода для решения вашей проблемы:

__block Person *aPerson = nil;

Для получения дополнительной информации, пожалуйста, обратитесь к этому руководству: Блоки и переменные

38 голосов
/ 03 марта 2014

Просто напоминание об ошибке, которую я тоже совершил,

 __block

объявление должно быть сделано при первом объявлении переменной, то есть ВНЕ блока, а не внутри него. Это должно решить проблемы, упомянутые в комментариях о том, что переменная не сохраняет свое значение за пределами блока.

17 голосов
/ 10 января 2014

Просто используйте префикс __block для объявления и назначения любого типа переменной внутри блока.

Например:

__block Person *aPerson = nil;

__block NSString *name = nil;
10 голосов
/ 29 апреля 2015
__block Person *aPerson = nil;
10 голосов
/ 09 октября 2013

Чтобы назначить переменную внутри блока, которая вне блока всегда использует спецификатор __block перед этой переменной, ваш код должен выглядеть следующим образом: -

__block Person *aPerson = nil;
3 голосов
/ 12 июня 2016

блок да - наиболее часто используемые функции, поэтому, чтобы избежать цикла сохранения, мы должны избегать использования сильной переменной, включая self внутри блока, несмотря на использование _weak или weakself.

3 голосов
/ 02 июля 2015

Попробуйте __weak, если вы получите предупреждение о сохранении цикла, в противном случае используйте __block

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

Теперь вы можете ссылаться на weakPerson объект внутри блока.

...