Thank you to anyone who has already donated - your generous donations helped make three months of treatment possible.

My brother Nate continues to fight stage IV Hodgkin's lymphoma. He's just 31, with a wife and baby girl. They have no active income (since he's been unable to return to work), no insurance, and cannot afford the treatment he needs. Nate and his family need your help. Please consider a donation, every dollar helps. Thanks.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
So, after some thinking, I found the solution: I have to declare a placeholder class inheriting from NSObject, then declare a bunch of function pointers (so it has to be refined a lot!!!). The actual function pointer doing the blocks' job is a function pointer using the return type and arg list plus self of the original block, like this (example code):

    #import <Foundation/Foundation.h>

    void blck(id _self, NSString *line, BOOL *stop) {
        printf("Line: %s\n", [line UTF8String]);
    }

    @interface BlockPlaceholder: NSObject {
        void *block0;
        void *block1;
        void *block2;
        void *block3;
        void *block4;
        void *block5;
        void *block6;
        void *block7;
    }
    @end

    @implementation BlockPlaceholder

    - (id) init {
        self = [super init];
        block0 = block1 = block2 = block3 = block4 = block5 = block6 = block7 = blck;
        return self;
    }

    @end

    int main() {
        NSAutoreleasePool *pool = [NSAutoreleasePool new];
        NSString *lines = @"This\nis\na\ntext\n";
        BlockPlaceholder *block_obj = [[BlockPlaceholder alloc] init];
        [lines enumerateLinesUsingBlock:block_obj];
        [block_obj release];
        [pool release];
        return 0;
    }

And this one does not crash, and outputs:


Line: This
Line: is
Line: a
Line: text

as expected. :-)