我对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
答案 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准备好的。
然后你就像使用弧一样处理偷偷摸摸的输入。