开发者

Objective-C: Is there an -invoke on blocks that takes parameters?

开发者 https://www.devze.com 2023-04-05 19:59 出处:网络
As you may be aware, blocks take -invoke: void(^foo)() = ^{ NSLog(@\"Do stuff\"); }; [foo invoke];// Logs \'Do stuff\'

As you may be aware, blocks take -invoke:

void(^foo)() = ^{
    NSLog(@"Do stuff");
};

[foo invoke];  // Logs 'Do stuff'

I would like to do the following:

void(^bar)(int) = ^(int k) {
     NSLog(@"%d", k);
};

[bar invokeWithParameters:7];   // Want it to log '7', but no such instance method

The ordinary argument-less -invoke works on bar, but it prints a nonsense value.

I can't find a direct message of this kind I can send to a block, nor can I find the original documentation that would describe how blocks take -invoke. Is there a list of messages accepted by blocks?

(Yes, I have tried to use class_copyMethodList to extract a list of methods from the runtime; there appear to be none.)

Edit: Yes, I'm also aware of invoking the block the usual way (bar(7);). What I'm really after is a selector for a m开发者_运维问答ethod I can feed into library code that doesn't take blocks (per-se).


You can invoke it like a function:

bar(7);

There's even an example in the documentation that uses exactly the same signature. See Declaring and Using a Block.

The best reference on the behavior of blocks is the Block Language Specification(RTF) document. This mentions certain methods that are supported (copy, retain, etc.) but nothing about an -invoke method.


A blocks very definition is the sum total of "messages" that the block can receive, in terms of the calling parameters/ABI.

This is for a couple of reasons:

First, a block is not a function and a block pointer is not a function pointer. They cannot be used interchangeably.

Secondly, the C ABI is such that you have to have a declaration of the function begin called when the call site is being compiled if the parameters are to be encoded correctly.

The alternative is to use something like NSInvocation, which allows the arguments to be encoded individually, but even that still requires full C ABI knowledge for each individual argument.

Ultimately, if you can compile a call site that has all the parameters, be it an Objective-C method or a function call, to the fidelity necessary to make the compiler happy, you can convert that call site into a call to the block.

I.e. unless you clarify your question a bit, what you are asking for is either already supported or nigh impossible due to the vagaries of the C ABI.

0

精彩评论

暂无评论...
验证码 换一张
取 消