MarcoCabazal
12/6/2012 - 5:35 PM

Blocks cheat sheet

Blocks cheat sheet

// http://cocoawithlove.com/2009/10/ugly-side-of-blocks-explicit.html has a nice breakdown of the syntax--it helps to think of the ^ as similar to a pointer dereference symbol *

// block typedef:

    typedef void(^Block)();
    typedef void(^ConditionalBlock)(BOOL);
    typedef NSString*(^BlockThatReturnsString)();
    typedef NSString*(^ConditionalBlockThatReturnsString)(BOOL);

// block property with typedef:

    @property(copy)Block theBlock;

// block property without typedef:

    @property(copy)void(^block)();
    @property(copy)void(^conditionalBlock)(BOOL);
    @property(copy)NSString*(^blockThatReturnsString)();
    @property(copy)NSString*(^conditionalBlockThatReturnsString)(BOOL);


// block definition inline:

    ReturnType(^block_name)(parmeter, types, here) = ^(parameter, types, here) {};
    
    void(^block)(void) = ^{};    
    void(^conditionalBlock)(BOOL shouldWork) = ^(BOOL shouldWork){};
    NSString*(^blockThatReturnsString)(void) = ^ NSString* { return @"foo"; };    
    NSString*(^conditionalBlockThatReturnsString)(BOOL shouldWork) = ^ NSString* (BOOL shouldWork){ 
        return shouldWork ? @"foo" : @"bar"; 
    };

    -(void)runBlocks {
        block();
        conditionalBlock(NO);
        NSString *someString = blockThatReturnsString();
        NSString *conditionalString = conditionalBlockThatReturnsString(NO);
    }

// blocks as return values:

    -(void (^)(void))doSomething;
    -(void (^)(BOOL))doSomethingConditionally;
    -(NSString* (^)(void))returnString;
    -(NSString* (^)(BOOL))returnStringConditionally;

    -(NSString* (^)(BOOL))returnStringConditionally {
        return ^(BOOL shouldReturn) {
            if (shouldReturn) return @"foo";
            return @"bar";
        }
    }
    
// blocks as arguments:

    -(void)doSomethingWithBlock:(void (^)(void))block;
    -(void)doSomethingWithBlock:(void (^)(BOOL))conditionalBlock;
    -(void)doSomethingWithBlock:(NSString* (^)(void))blockThatReturnsString;
    -(void)doSomethingWithBlock:(NSString* (^)(BOOL))conditionalBlockThatReturnsString;