1 | #import "ivars-in-blocks.h" |
2 | #import <stdio.h> |
3 | |
4 | typedef int (^my_block_ptr_type) (int); |
5 | |
6 | @interface IAmBlocky() |
7 | { |
8 | int _hidden_ivar; |
9 | my_block_ptr_type _block_ptr; |
10 | } |
11 | |
12 | @end |
13 | |
14 | @implementation IAmBlocky |
15 | |
16 | + (int) addend |
17 | { |
18 | return 3; |
19 | } |
20 | |
21 | + (void) classMethod |
22 | { |
23 | int (^my_block)(int) = ^(int foo) |
24 | { |
25 | int ret = foo + [self addend]; |
26 | return ret; // Break here inside the class method block. |
27 | }; |
28 | printf(format: "%d\n" , my_block(2)); |
29 | } |
30 | |
31 | - (void) makeBlockPtr; |
32 | { |
33 | _block_ptr = ^(int inval) |
34 | { |
35 | _hidden_ivar += inval; |
36 | return blocky_ivar * inval; // Break here inside the block. |
37 | }; |
38 | } |
39 | |
40 | - (IAmBlocky *) init |
41 | { |
42 | blocky_ivar = 10; |
43 | _hidden_ivar = 20; |
44 | // Interesting... Apparently you can't make a block in your init method. This crashes... |
45 | // [self makeBlockPtr]; |
46 | return self; |
47 | } |
48 | |
49 | - (int) callABlock: (int) block_value |
50 | { |
51 | if (_block_ptr == NULL) |
52 | [self makeBlockPtr]; |
53 | int ret = _block_ptr (block_value); |
54 | [IAmBlocky classMethod]; |
55 | return ret; |
56 | } |
57 | @end |
58 | |
59 | |