【问题标题】:How to add objects to CCArray from a different class with ARC如何使用 ARC 从不同的类将对象添加到 CCArray
【发布时间】:2012-11-21 16:57:16
【问题描述】:

我需要将我的代码转换为 ARC。我有一个用于绘制路径的 CCArray。我从不同的类填充 CCArray 值的对象。

问题是转换为ARC后,CCArray总是返回null

我看不出我做错了什么。

瓢虫.h

@interface Ladybug : CCSprite <CCTargetedTouchDelegate>{

    CCArray *linePathPosition;
}
@property (nonatomic, strong) CCArray *linePathPosition;

@end

瓢虫.m

@synthesize linePathPosition;

-(id) init
{
    if( (self=[super init] )) {
        self.linePathPosition = [[CCArray alloc] init];

    }
    return self;
}
-(void) updatePosition:(CGPoint) position
{
    [self.linePathPosition addObject:[NSValue valueWithCGPoint:position]];
    NSLog(@"line path %@",linePathPosition);
}
-(void) breakMoveLadyBug
{
    [self.linePathPosition removeAllObjects];
}

在主.m

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    Ladybug *ladybug1 = (Ladybug *)[self getChildByTag:99];
    CCMotionStreak* streak = (CCMotionStreak *)[self getChildByTag:999];
    CGPoint touchLocation = [touch locationInView: [touch view]];
    CGPoint curPosition = [[CCDirector sharedDirector] convertToGL:touchLocation];

    if (ladybug1.isSelected) {

        streak.position = curPosition;
        [ladybug1 updatePosition:curPosition];
                NSLog(@"Cur position %@",NSStringFromCGPoint(curPosition));

        if (!ladybug1.isMoving) {

            [ladybug1 startMoveLadyBug];
        }
    }
}

日志:

 Cur position {331, 110}
 line path (null)

我做错了什么?使用 ARC 定义和初始化 CCArray 的正确方法是什么?

【问题讨论】:

  • 我在您提供的代码中没有看到 NSArray。
  • @bbarnhart CCArray 抱歉编辑了主题和问题
  • 你在哪里初始化你的瓢虫对象?
  • @ColdLogic bug.m is Ladybug.m 我用self.linePathPosition = [[CCArray alloc] init]初始化CCArray
  • 不,我看到你在哪里初始化你的 linePathPosition 对象,你在哪里调用[[Ladybug alloc] init]

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


【解决方案1】:

这不是 ARC 或 CCArray 的问题。问题在于你对objective-c的理解。

为了解决你的问题,无论你在哪里做这行[self addChild:ladybug1 z:999 tag:99]。改为这样做:

Ladybug *ladybug1 = [[Ladybug alloc] init];
[self addChild:ladybug1 z:0 tag:99];

注意:这是在 ccTouchMoved 函数之外完成的,在某些将瓢虫对象添加到场景/图层的函数中。

然后您的ccTouchMoved 函数将分配一个瓢虫对象来使用。

问题在于,如果您从不调用瓢虫对象的 init 函数,CCArray 将永远不会被分配,因此所有内容都将为空。然后,您将尝试将点添加到空数组,这将无济于事。你可以做你想做的所有这些标签的事情(我个人不知道你为什么这样做),但是你需要为瓢虫对象指定标签。所以将它添加到 CCLayer/CCScene(你正在使用的 w/e)中,并设置它的标签。然后就可以使用getChildByTag函数了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多