如果我没看错的话,它是一个块,它返回一个返回块的函数指针。这个名字是一个提示。
解决问题的一种方法是从最终结果开始并向后工作。或者,从内部开始,向外工作。
get_block_factory_funcptr 是什么?这是一个块:
MyBlock get_block_factory_funcptr;
它有什么作用?它需要一个 void 并返回一个“块工厂”函数指针。让我们声明MyBlock:
typedef FactoryFuncPtr (^MyBlock)(void);
FactoryFuncPtr 是什么?它接受int 并返回另一个块:
typedef OuterBlock (*FactoryFuncPtr)(int);
OuterBlock 是什么?它接受void 并返回int:
typedef int (^OuterBlock)(void);
这些是相反顺序的声明。
编辑:一个工作示例。
#import <Foundation/Foundation.h>
typedef int (^OuterBlock)(void);
typedef OuterBlock (*FactoryFuncPtr)(int);
typedef FactoryFuncPtr (^MyBlock)(void);
OuterBlock factory(int foo) {
return ^ {
printf("A block with %d\n", foo);
return 123;
};
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int (^(*(^get_block_factory_funcptr)(void))(int))(void) = ^ {
return &factory;
};
MyBlock myBlock = get_block_factory_funcptr;
FactoryFuncPtr foo = myBlock();
OuterBlock bar = foo(999);
int baz = bar();
printf("Final %d\n", baz);
}
return 0;
}