“Converting” a function pointer to a block in objective-C

后端 未结 3 2184
星月不相逢
星月不相逢 2021-02-20 07:48

I\'m doing some Interop from Mono C# to Obj-C and ran into this problem. The C# code needs to pass a callback - which it does with a function pointer. I can get the function poi

3条回答
  •  北荒
    北荒 (楼主)
    2021-02-20 08:24

    What about

    void (*myFunc)(int x); // ... your function pointer
    
    void (^myBlock)(int) = ^(int x) {
        myFunc(x);
    };
    

    Then myBlock is a block that captures the value of the function pointer and calls the function when the block is executed.


    ADDED: My suggestion, based on your code, using a @property (and assuming that you compile with ARC):

    FunctionToBlock.h:

    typedef void (*DummyAction)(char * result);
    typedef void (^DummyBlock)(char * result);
    
    @interface FunctionToBlock : NSObject
    {
        DummyAction function; // Not really needed.
    }
    
    - (id) initWithFunction: (DummyAction) func;
    @property(copy, nonatomic) DummyBlock block;   // "copy" is important here!
    
    @end
    

    FunctionToBlock.m:

    #import "FunctionToBlock.h"
    
    @implementation FunctionToBlock : NSObject
    @synthesize block = _block; // Can be ommitted if you use Xcode 4.4 or later.
    
    - (id) initWithFunction: (DummyAction) func
    {
        if (self = [super init]) {
            function = func; // Not really needed.
            self.block = ^(char * result) {
                func(result); // Use "func", not "self->function", to avoid retain cycle.
            };
        }
        return self;
    }
    

提交回复
热议问题