The block should take no parameters and have no return value.
So then the question is what can the block do? In this example, we get values from a loop counter and also call a function defined in the same file.
A run loop is required in order to see any output (and the output is truncated if the run loop's time interval is shortened).
// clang blocks.m -o prog -framework Foundation -fobjc-gc-only
#import <Foundation/Foundation.h>
void f() { printf("."); }
typedef void (^B)();
int main(int argc, char * argv[]) {
NSOperationQueue *q = [NSOperationQueue mainQueue];
int N = 100;
__block int c = 0;
NSLog(@"%p", &f);
NSLog(@"%p", &main);
NSLog(@"%p", &c);
B b = ^() {
f();
c++;
if (c && !(c%(N/10))) {
printf("c = %3d\n", c);
}
};
NSLog(@"%p", &b);
B b2 = [b copy];
NSLog(@"%p", &b2);
for (int i = 0; i < N; i++) {
[q addOperation:[NSBlockOperation blockOperationWithBlock:b]];
}
NSRunLoop* rl = [NSRunLoop currentRunLoop];
NSLog(@"%p", &rl);
[rl runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
return 0;
}
|
> ./prog 2012-05-19 08:53:26.881 prog[2988:707] 0x103da99c0 2012-05-19 08:53:26.883 prog[2988:707] 0x103da99e0 2012-05-19 08:53:26.883 prog[2988:707] 0x7fff639a7ba8 2012-05-19 08:53:26.884 prog[2988:707] 0x7fff639a7b88 2012-05-19 08:53:26.884 prog[2988:707] 0x7fff639a7b88 2012-05-19 08:53:26.885 prog[2988:707] 0x7fff639a7b50 2012-05-19 08:53:26.887 prog[2988:707] 0x7fff639a7b40 ..........c = 10 ..........c = 20 ..........c = 30 ..........c = 40 ..........c = 50 ..........c = 60 ..........c = 70 ..........c = 80 ..........c = 90 ..........c = 100 |
main and f, are on the stack.This isn't a particularly useful example. I have to look into things some more to find a good toy example for concurrent execution.