I’ve started using Objective-C blocks today. I wrote the following code:
NSArray *array = @[@25, @"abc", @7.2];
void (^print)(NSUInteger index) = ^(NSUInteger index)
{
NSLog(@"%@", array[index]);
};
for (int n = 0; n < 3; n++)
print(n);
Which works properly. I needed to change the array variable after its declaration, though, so I tried using the following code:
NSArray *array;
void (^print)(NSUInteger index) = ^(NSUInteger index)
{
NSLog(@"%@", array[index]);
};
array = @[@25, @"abc", @7.2];
for (int n = 0; n < 3; n++)
print(n);
However, that doesn’t work. The console just prints (null) three times. Why is it that this doesn’t work, while it did work with my first piece of code?
It’s because the block captures variables by value and when the block is created (unless you use
__block).What you probably want is:
Example with
__block:Note that it’s a little less efficient to use
__blockif you don’t actually need to modify the variable inside the block and have it reflected outside.