ARC上SneakyInput的问题

时间:2013-06-29 11:23:50

标签: objective-c cocos2d-iphone automatic-ref-counting

我对Objective-C比较新,我开始经历SneakyInput。我将它添加到我正在制作的小应用程序(它启用了ARC)中,当我运行应用程序时它只是崩溃了。我再次尝试,为非ARC编码偷偷摸摸的输入,它完美无缺。

这是ARC版本(启用了ARC),它崩溃了

- (void)initJoystick
{
    SneakyJoystickSkinnedBase *joystickBase;
    joystickBase.backgroundSprite = [CCSprite spriteWithFile:@"Icon-Small@2x.png"];
    joystickBase.thumbSprite = [CCSprite spriteWithFile:@"Icon-Small.png"];

    joystickBase.joystick = [[SneakyJoystick alloc] initWithRect: CGRectMake(0, 0, 128, 128)];

    joystickBase.position = ccp(55, 55);
    [self addChild:joystickBase];
}

- (id)init
{
    if( (self=[super init]) )
    {
        [self initJoystick];
    }
return self;
}

@end

这是非ARC版本,它不会崩溃

- (void)initJoystick
{
    SneakyJoystickSkinnedBase *joystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
    joystickBase.backgroundSprite = [CCSprite spriteWithFile:@"Icon-Small@2x.png"];
    joystickBase.thumbSprite = [CCSprite spriteWithFile:@"Icon-Small.png"];

    joystickBase.joystick = [[SneakyJoystick alloc] initWithRect: CGRectMake(0, 0, 128, 128)];

    joystickBase.position = ccp(55, 55);
    [self addChild:joystickBase];

    leftJoystick = [joystickBase.joystick retain];
}

-(id) init
{
    if( (self=[super init]) )
    {
        [self initJoystick];
    }
return self;
}

@end

我想继续使用应用程序的其余部分ARC,所以我想知道是否有人可以告诉我如何解决这个问题,以免它崩溃。对不起,如果非常noobie问题。

这是启用ARC时输出中出现的错误消息

2013-06-29 20:49:15.724 joystick[2135:12c03] *** Assertion failure in -[HelloWorldLayer addChild:], 
/Users/monagros/Desktop/Stuff/Cocos2D/apps/joystick/joystick/libs/cocos2d/CCNode.m:362

2 个答案:

答案 0 :(得分:1)

在非ARC版本中,您使用alloc / init设置joystickBase

SneakyJoystickSkinnedBase *joystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];

但是在你的代码的ARC版本中,你不是;你要离开joystickBase为零。该对象的addChild:方法为checking for a nil value

使用ARC,您应该像这样初始化joystickBase

SneakyJoystickSkinnedBase *joystickBase = [[SneakyJoystickSkinnedBase alloc] init];

答案 1 :(得分:0)

您可以告诉编译器不要使用arc来进行偷偷摸摸的输入。

单击您的项目,然后单击您的目标。选择构建阶段,并搜索sneakyinput

当你发现sneakyinput.m时,双击为编译器标志保留的空格中的空白区域。然后写下:

-fno-objc-arc

如果使用非弧特征,此方法很好。我想偷偷摸摸的输出不是ARC准备好的。

然后你就像使用弧一样处理偷偷摸摸的输入。