在启用ARC的情况下通过ccmenuitem传递userData

时间:2013-07-09 12:59:19

标签: cocos2d-iphone automatic-ref-counting kobold2d

我正在尝试使用以下代码

通过menuitem传递NSString
CCMenuItem * buyButton = [CCMenuItemLabel itemWithLabel:buyLabel target:self selector:@selector(buyItem:)];
buyButton.userData = (__bridge void *)((NSString*)(itemName));

到以下选择器

-(void) buyItem:(CCMenuItemLabel*)sender {
   NSString * itemName = (NSString *)sender.userData;
     }

但我在选择器中崩溃了。我正在使用启用了arc的cocos2d,因此是userdata分配中的桥接器。 (kobold2d)。任何想法?

2 个答案:

答案 0 :(得分:5)

你的实际崩溃问题是:

NSString * itemName = (NSString *)sender.userData;

看看它,你在这里投了什么?右:您将sender投射到NSString*,然后您向发件人(CCMenuItemLabel)发送userData消息。 BAM!

拯救的支架:

NSString * itemName = (__bridge NSString *)(sender.userData);

另外,为什么在有userObject时会让它过于复杂?

buyButton.userObject = itemName;

userObject是id类型,不需要桥接,userData为void*并且需要桥接

答案 1 :(得分:0)

试试这个,它的工作

 CCMenuItem * buyButton = [CCMenuItemLabel itemWithLabel:buyLabel target:self selector:@selector(buyItem:)];
 NSString *userDataString = [NSString stringWithFormat:@"kidnim"];            
 buyButton.userData = (__bridge void *)userDataString;

 CCMenu *menu = [CCMenu menuWithItems:buyButton, nil];
 menu.position = ccp(240, 160);
 [self addChild:menu];

和buyItem功能:

-(void) buyItem:(CCMenuItemLabel*)sender {
    NSString * itemName = (__bridge NSString*)sender.userData;
    printf("NSString: %s\n", [itemName UTF8String]);
}

你会得到Out put as

NSString:kidnim