Призначте змінну всередині блоку змінній поза блоком


381

Я отримую помилку

Змінна не призначається (відсутній специфікатор типу __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;

Відповіді:


779

Для вирішення проблеми вам потрібно скористатися цим рядком коду:

__block Person *aPerson = nil;

Більш детальну інформацію можна знайти в цьому підручнику: Блоки та змінні


101
Зверніть увагу, що __blockце префікс з двома підкресленнями.
Ерік Бротто

12
за допомогою __blockмоєї помилки пішло, але значення не зберігається поза блоком. Будь-яка допомога тут
користувач16119012

7
Блок називається добре після того, як він виглядає так, як його слід викликати, іншими словами, блоки не працюють "відразу".
Том Андерсен

1
Якщо блоки не працюватимуть ПРАВИЛЬНО, то це не слід сприймати як відповідь, оскільки це робить неабияким вимикачем угод.
міцно

3
Ця відповідь правильна щодо розміщеного питання, не соромтесь написати ще одне питання, якщо у вас є інший сценарій.
Деварші

40

Просто нагадування про помилку, яку я зробив і сам

 __block

декларація повинна бути зроблена при першому оголошенні змінної, тобто ВНУТРІ блоку, а не всередині нього. Це повинно вирішити проблеми, згадані в коментарях до змінної, не зберігаючи свого значення поза блоком.


18

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

Наприклад:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

Щоб призначити змінну всередині блоку, яка поза блоком завжди використовує специфікатор __block перед цією змінною, ваш код повинен бути таким:

__block Person *aPerson = nil;


3

Спробуйте, __weakякщо ви отримаєте попередження щодо використання іншого циклу збереження__block

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

Тепер ви можете посилатись на weakPersonоб'єкт всередині блоку.


3

так, блок є найбільш використовуваною функціональністю, тому, щоб уникнути циклу збереження, нам слід уникати використання сильної змінної, включаючи самоврядування всередині блоку, незважаючи на використання _weak або слабкого.


0

Коли я побачив ту саму помилку, я спробував її вирішити так:

   __block CGFloat docHeight = 0.0;


    [self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
        //height
        NSLog(@"=========>document.height:@%@",height);
        docHeight = [height floatValue];
    }];

і його добре працює

Просто додайте " __block " перед змінною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.