Assign a variable inside a Block to a variable outside a Block

Objective CCompiler ErrorsObjective C-Blocks

Objective C Problem Overview


I'm getting an error

>Variable is not assignable (missing __block type specifier)

on the line aPerson = participant;. How can I make sure the block can access the aPerson variable and the aPerson variable can be returned?

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;

Objective C Solutions


Solution 1 - Objective C

You need to use this line of code to resolve your problem:

__block Person *aPerson = nil;

For more details, please refer to this tutorial: Blocks and Variables

Solution 2 - Objective C

Just a reminder of a mistake I made myself too, the

 __block

declaration must be done when first declaring the variable, that is, OUTSIDE of the block, not inside of it. This should resolve problems mentioned in the comments about the variable not retaining its value outside of the block.

Solution 3 - Objective C

Just use the __block prefix to declare and assign any type of variable inside a block.

For example:

__block Person *aPerson = nil;

__block NSString *name = nil;

Solution 4 - Objective C

To assign a variable inside block which outside of block always use __block specifier before that variable your code should be like this:-

__block Person *aPerson = nil;

Solution 5 - Objective C

__block Person *aPerson = nil;

Solution 6 - Objective C

Try __weak if you get any warning regarding retain cycle else use __block

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

Now you can refer weakPerson object inside block.

Solution 7 - Objective C

yes block are the most used functionality , so in order to avoid the retain cycle we should avoid using the strong variable,including self inside the block, inspite use the _weak or weakself.

Solution 8 - Objective C

When I saw the same error, I tried to resolve it like:

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

and its working fine

Just add "__block" before Variable.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontommiView Question on Stackoverflow
Solution 1 - Objective CDevarshiView Answer on Stackoverflow
Solution 2 - Objective CDenis BalkoView Answer on Stackoverflow
Solution 3 - Objective CUmesh SawantView Answer on Stackoverflow
Solution 4 - Objective CGauravView Answer on Stackoverflow
Solution 5 - Objective CKetan PatelView Answer on Stackoverflow
Solution 6 - Objective CPradeepKNView Answer on Stackoverflow
Solution 7 - Objective Cuser6311313View Answer on Stackoverflow
Solution 8 - Objective CMr.Javed MultaniView Answer on Stackoverflow