0

我对 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
4

2 回答 2

1

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

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

但是在您的代码的 ARC 版本中,您不是;你离开joystickBase时为零。该addChild:方法正在检查该对象的 nil 值。

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

SneakyJoystickSkinnedBase *joystickBase = [[SneakyJoystickSkinnedBase alloc] init];
于 2013-06-29T11:48:28.200 回答
0

您可以告诉编译器不要将 arc 用于偷偷摸摸的输入。

单击您的项目,然后单击您的目标。选择构建阶段,然后搜索偷偷摸摸的输入

当您找到sneakyinput.m 时,双击为编译器标志保留的空间中的空白。然后写这个:

-fno-objc-arc

如果您使用非圆弧特征,此方法很好。我猜偷偷摸摸的输入还没有准备好 ARC。

然后,您就像启用 arc 一样对待偷偷摸摸的输入。

于 2013-06-30T08:23:58.837 回答