【问题标题】:Block that returns a block without typedef返回没有 typedef 的块的块
【发布时间】:2012-06-06 21:09:16
【问题描述】:

如果不使用 typedef,我无法弄清楚如何做到这一点:


typedef void(^HLBlock)(void);

- (void)whatever
{
    HLBlock (^genBlock)(int) = ^(int tryCount){
        HLBlock b1 = [[^{
            NSLog(@"tryCount=%i", tryCount);
        } copy] autorelease];
        return b1;
    };

    genBlock(10);
}

我需要将 HLBlock 声明为 void (^)(void) 的 typedef,这似乎很愚蠢,但对于我来说,如果没有 typedef,我无法弄清楚如何做到这一点。 genBlock 的正确返回类型是什么?

谢谢! 杰米

【问题讨论】:

  • 除非您在 ARC 中,否则您需要在返回时复制该块。
  • @KevinBallard 当然,但我希望我的要求仍然应该很清楚。
  • 请注意,dispatch_block_t 已经是 void (^)(void) 的类型定义。
  • @KenThomases,很好的观点,而且很容易理解。

标签: objective-c objective-c-blocks


【解决方案1】:

这是没有 typedef 的语法,但我认为它是如此难以理解,因此 typedef 是首选:

void(^(^genBlock)(int))() = ^(int tryCount){
  void (^b1)() = ^{
    NSLog(@"tryCount=%i", tryCount);
  };
  return b1;
};

void(^aBlock)() = genBlock(10);
aBlock();

【讨论】:

  • 这里是 cdecl 描述:cdecl.ridiculousfish.com/…
  • @RobNapier 这真的是最简单的语法吗?为什么这不起作用: (void(^)(void))(^genBlock)(int) = ^(int tryCount) { ... } 我问 b/c 你写的东西似乎不等同于它会如何与我在此评论中给出的示例相比,使用 typedef。
  • 这是最简单的语法。您需要仔细考虑函数指针语法如何真正起作用才能理解它。按照 Kevin 的链接进行一些探索。并查看 Matt Gallagher 的精彩文章:cocoawithlove.com/2009/10/ugly-side-of-blocks-explicit.html
  • +1 好的,谢谢,只是想确认一下。感谢您的提示!
  • 当我试图声明一个在方法参数中返回一个块的块时,Xcode 抱怨(愚蠢!),所以我认为 Xcode/clang/Objective-C 只是不支持返回块。我简直不敢相信。感谢您的回答,我发现 Objective-C/C 是非常强大的语言——如此强大,以至于当您开始编写复杂的结构时,它们变得异常困难。我会坚持typedef void(^CCSimpleBlock)(void)。 :-p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多