【问题标题】:Cocos2d MenuItemLabel using Blocks causes SIGABRTCocos2d MenuItemLabel 使用 Blocks 导致 SIGABRT
【发布时间】:2012-03-19 11:59:21
【问题描述】:

在 Cocos2D 中,使用块创建菜单操作会导致该场景的 init 方法中出现 SIGABRT 错误:

 CCLabelTTF *label = [CCLabelTTF labelWithString:@"test" fontName:@"Times" fontSize:12];
 CCMenuItemLabel *toCauseCrash = [CCMenuItemLabel itemWithLabel:label block:^(id sender) {
  NSLog(@"Blocks work?");
}];

试过最新的Cocos2D,没有。 This forum post 承诺 (a) 很快会发布一个修补程序,并编辑“BuildSettings-iOS.xcconfig”文件(据我所知,该文件不存在)。

(1) 有谁知道如何修复 Cocos2D 以允许菜单中的块?

(2) 有谁知道上面的帖子说的是什么 xcconfig 文件,或者如何找到它?(那是 Kobold2d 的东西)

编辑:这是我在 OTHER_LINKER_FLAGS 中设置“-force_load $(BUILT_PRODUCTS_DIR)/”后尝试的代码示例:

id blockAction = [CCCallBlock actionWithBlock:^{
  NSLog(@"Blocks action");
}];

void (^reusableBlock)(id sender) = ^(id sender) {
  NSLog(@"Reusable block");
};
// SIGABRT:
CCMenuItemLabel *menuItem = [CCMenuItemLabel itemWithLabel:myLabel block:blockAction];
// SIGABRT:
CCMenuItemLabel *menuItem = [CCMenuItemLabel itemWithLabel:myLabel block:reusableBlock];

【问题讨论】:

  • 我遇到了 menuItem 中的块问题,阻止了在解除分配父项时正确释放该项目。我的建议是暂时不要在 MenuItems 中使用块并坚持目标:选择器:
  • @Ultrakorne 是的,这就是我要描述的问题。我希望能解决问题。与此同时,是的,我正在使用这种解决方法。

标签: ios cocos2d-iphone objective-c-blocks


【解决方案1】:

论坛帖子参考Kobold2D。但是如果您将 cocos2d 构建到静态库中,同样的问题也适用,尽管不会有任何 .xcconfig 文件。在这种情况下,您必须 -force_load your cocos2d lib 才能使用 CCMenu 块,方法是将其添加到 Build Settings 中的“Other Linker Flags”部分。

另一个需要注意的问题当然是您的部署目标必须设置为 iOS 4.0 或更高版本。块在 iOS 3.x 中不可用。

【讨论】:

  • 谢谢你——试过了,但每当我使用块时仍然会得到 SIGABRT。 (编辑帖子以提供代码,因为这里的格式不正确。)
【解决方案2】:

现在的答案似乎是:块是有问题的,即使您在 cocos2d 库上使用 -force_load 也是如此。如果有一天我可以接受这个问题的不同答案,我会非常高兴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2016-11-04
    • 2011-07-03
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多