A block is two things; a hunk of executable code and state captured at the moment when execution passes over the block.
I.e. given:
myBlock = ^{ return someVariable + someOtherVariable; };
When compiled, this creates a chunk of code that acts very much like a function that adds two variables together returns the result. No block instance is created.
When executing, when the expression myBlock = ^{...};
is evaluated, then a block instance is created. Inside that block instance is a reference to the code the compiler created and a copy of the values contained in the two variables at the time the assignment to myBlock
was made (unless, of course, __block
is in play, etc...).
That answers (2), but is relevant to answering (1).
At runtime, you can create instances of existing, compiled, blocks all day long. You cannot, however, create new kinds of blocks. Doing so would require a compiler and would be limited to runtime environments where compiling new executable code and actually executing it is possible.