Here :
#1 blocks overview
#2 blocks have lexical scope
#3 definition
#4 example : performSelectorOnMainThread
#1 Blocks overview
Block is an object that encapsulates a portion of code.
^{ <obj-c block code> }
Each time you want to pass as argument a piece of code to a method you can use blocks. In the same way if you want to assign to a variable a portion of code then you can use again blocks. Using a pseudocode:
[ object doThisActions:^{ <obj-c block code> } ];
#2 Blocks have lexical scope
Blocks have lexical scope. This mean that codes in a block <obj-c block code> has access to local variables in the same scope where block is defined/wrote. So if you pass a block as argument of a method then your <obj-c block code>, when executed at run-time, has access to variables present at definition point. Block brings all variables “copied”. But by default access to those variables are read-only. If you want to have write-access you have to use __block : if you declare a variable with the __block modifier, then you can change its value within the block.
{ ...
__block char charCanBeChanged; // local variable
...
void (^myBlockName)(void) = ^(void) { // definition of block
charCanBeChanged = '\0'; //<obj-c block code> has access to local variable
}
}
Just as background there are two sort of scope :
- Lexical scoping : scope is referred to static program text
- Dynamic scoping : scope is referred to dynamic flow of execution
More here (click-here) from apple.
#3 Definition
The start of a block is specified using char : ^
Basically there are two types of definition for blocks:
Inline : as a argument of a method
…withObject:^{return updateThisPosition;}…
[self performSelectorOnMainThread: @selector(wrapperForUpdateRendering:)
withObject:^{return updateThisPosition;}
waitUntilDone:YES];
Variable assignment: blocks are defined as a variable
int (^myBlockName)(void) = ^(void) {…
int (^myBlockName)(void) = ^(void) { return updateThisPosition; };
[self performSelectorOnMainThread:@selector(wrapperForUpdateRendering:)
withObject:myBlockName //myBlockName is the variable associated to block
waitUntilDone:YES];

#4 Example : performSelectorOnMainThread
NSInteger updateThisPosition = ...;
...
...
[self performSelectorOnMainThread:@selector( wrapperForUpdateRendering: )
withObject:^{return updateThisPosition;}
waitUntilDone:YES];
....
....
-(void)wrapperForUpdateRendering:(NSInteger (^)(void))myBlockName{
NSInteger wposition = myBlockName(); //myBlockName is the variable associated to block passed as argument
[self updateRendering:wposition];
}
In this example performSelectorOnMainThread invokes wrapperForUpdateRendering passing as argument block: ^{return updateThisPosition;}. wrapperForUpdateRendering uses that block myBlockName(); in order to get updateThisPosition and redraw rendering (OnMainThread).
Add Comment