DrJ*_*000 11 objective-c objective-c-blocks
您可能知道,块采取-invoke:
void(^foo)() = ^{
NSLog(@"Do stuff");
};
[foo invoke]; // Logs 'Do stuff'
Run Code Online (Sandbox Code Playgroud)
我想做以下事情:
void(^bar)(int) = ^(int k) {
NSLog(@"%d", k);
};
[bar invokeWithParameters:7]; // Want it to log '7', but no such instance method
Run Code Online (Sandbox Code Playgroud)
普通的自由论点-invoke可以使用bar,但它打印出一个无意义的值.
我找不到这种可以发送到块的直接消息,也无法找到描述块如何采用的原始文档-invoke.是否有块接受的消息列表?
(是的,我尝试使用class_copyMethodList从运行时提取方法列表;似乎没有.)
编辑:是的,我也知道以通常的方式调用块(bar(7);).我真正追求的是一个方法的选择器,我可以提供给不带块的库代码(本身).
Cal*_*leb 11
您可以像函数一样调用它:
bar(7);
Run Code Online (Sandbox Code Playgroud)
文档中甚至有一个使用完全相同签名的示例.请参阅声明和使用块.
关于块行为的最佳参考是块语言规范(RTF)文档.这提到了支持(复制,保留等)的某些方法,但没有提及-invoke方法.
块的非常定义是块可以根据调用参数/ ABI接收的"消息"的总和.
这有几个原因:
首先,块不是函数,块指针不是函数指针.它们不能互换使用.
其次,将C ABI就是这样,你必须有功能的声明开始的时候,如果参数被正确编码被编译调用站点调用.
另一种方法是使用类似NSInvocation的东西,它允许单独编码参数,但即便如此,仍然需要每个单独参数的完整C ABI知识.
最后,如果您可以编译一个具有所有参数的调用站点,无论是Objective-C方法还是函数调用,为了使编译器满意所需的保真度,您可以将该调用站点转换为对块的调用.
即除非你澄清一下你的问题,否则由于C ABI的变幻莫测,你所要求的要么已经得到支持,要么几乎不可能.
| 归档时间: |
|
| 查看次数: |
4645 次 |
| 最近记录: |