I've seen many blocks with void return type. But it's possible to declare non-void blocks. Whats the usage of this?

Block declaration,

```
-(void)methodWithBock:(NSString *(^)(NSString *str))block{
     // do some work
    block(@"string for str"); // call back
}

```

Using the method,

```
[self methodWithBock:^NSString *(NSString *str) {

        NSLog(str); // prints call back
        return @"ret val"; // <- return value for block 
    }];

```

In above block declaration , what exactly is the purpose of NSString return type of the block? How the return value ( "ret val") can be used ?