使用Blocks的Cocos2d MenuItemLabel会导致SIGABRT

时间:2012-03-19 11:59:21

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

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

 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];

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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