CAAction 导致保留

Posted

技术标签:

【中文标题】CAAction 导致保留【英文标题】:CAAction causing a retain 【发布时间】:2014-01-20 18:29:46 【问题描述】:

我有一个我正在创建的对象导致我在保留方面出现一些问题。我正在制作一个永远重复运行动画的对象。当我删除添加动画的行并重复时,它不会保留,但是当我重新添加该行时,我可以通过使用仪器来判断该对象正在被保留。这是我正在使用的代码。不知道问题出在哪里。

- (id)initWithConveyorId:(int)conveyorId 

  self = [super init];
  if (self) 

    self.conveyorId = conveyorId;
    self.zOrder = kZLevelWaterTile;
    [self setFlowTexture];
  
  return self;


- (void)setFlowTexture 

  NSMutableArray *animationFrames = [NSMutableArray array];

  for (int i=1; i<=kNumberOfDirections; i++) 
    [self addAnimationFrameToArray:animationFrames withIndex:i andFlow:kWest];
  

  [self runAnimationWithFrames:animationFrames];


- (void)addAnimationFrameToArray:(NSMutableArray*)animationFrames withIndex:(int)index andFlow:(NSString*)flow

  NSString* textureName = [NSString stringWithFormat:kTextureFlow, flow];
  CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
                          [NSString stringWithFormat:kSpriteFrame, textureName, index]];
  [animationFrames addObject:frame];


- (void)runAnimationWithFrames:(NSMutableArray*)animationFrames 


  CCAnimation* flowAnimation = [CCAnimation animationWithSpriteFrames:animationFrames delay:0.1];

  CCAction* flowAction = [CCRepeatForever actionWithAction:
                          [CCAnimate actionWithAnimation:flowAnimation]];
  [self runAction:flowAction];

任何关于为什么这会导致保留的见解都会很棒!谢谢!

编辑:

这是创建传送带的代码。此方法中的方法是说服方法。我已经测试了这些论文,唯一遇到的问题是使用 CCAction 添加动画。

- (void)constructRiverWithMaximum:(int)amount 

  FFTile* freeTile = [self.matrix getFreeTile];
  FFConveyor* currentConveyor = [[FFConveyor alloc] initWithConveyorId:self.conveyorId];

  [self replaceTile:freeTile to:currentConveyor];
  amount--;
  int countConveyorsOnRiver = 1;

//  FFConveyor* currentConveyor = firstConveyor;
  BOOL hasNext;
  FFConveyorFlow directionOfLastTile = FFConveyorFlowNoDirection;
  int count = 0;
  do 

    int x = currentConveyor.columnIndex;
    int y = currentConveyor.rowIndex;

    NSArray* weights = [self getWeightsByX:x Y:y];
    NSArray* probabilities = [self getProbabilitiesByWeights:weights standardWeight:self.standardWeight];

    int directionOfCurrentTile = [self defineDirection:probabilities withConveyorCount:countConveyorsOnRiver];
    if (directionOfCurrentTile == kConveyorOver) 

      hasNext = false;
      directionOfCurrentTile = directionOfLastTile;
    
    else 
      if (amount <= 0)
        hasNext = false;
       else 
        hasNext = true;
      

    

    [self setFlowDirectionFrom:directionOfLastTile to:directionOfCurrentTile forConveyor:currentConveyor];

            currentConveyor = [self switchToTurningConveyorIfNeededForConveyorTile:currentConveyor];
    //[currentConveyor setFlowTexture];
    directionOfLastTile = directionOfCurrentTile;

    if (hasNext) 

      int conveyorIndex = [self.matrix nextIndexByX:x Y:y direction:directionOfCurrentTile];
      FFTile* tile = [self.matrix.tiles objectAtIndex:conveyorIndex];

      if ([self.matrix isTileFree:tile])

        currentConveyor = [self createConveyorAtIndex:conveyorIndex];
        amount--;
        countConveyorsOnRiver++;
       else 

        hasNext = false; //end because find another conveyor tile
      
    
    count++;
   while (hasNext);
  self.conveyorId++; 

【问题讨论】:

到底是什么问题?哪个对象被保留?为什么保留对您来说是个问题? 被保留的对象是传送带对象。保留是一个问题,因为一旦用户完成了一个级别,它就会被废弃并引入新的级别,所以这个级别应该释放。 贴出创建和使用传送带的代码 在添加此传送带的节点(场景)中,确保通过清理删除所有对象(停止操作,从而允许释放具有运行动画和内容的对象)。 onExit 是一个很好的地方,如果你选择这样做,请确保你 [super onExit]。 刚刚发布了创建和使用传送带的代码。 【参考方案1】:

我对这里的问题并不完全清楚。但是,如果您问为什么添加对象时会保留它们:

    根据您的代码,这是因为您将它们添加到可变数组中(只要对象在数组“内部”,它将保留该对象)。

    我也没有看到您可能会创建一个新对象,然后将它们添加到数组中,但您不会在创建它们后释放它们(假设这些是创建它们的便捷方法)。

    1234563 ) 在 dealloc 方法中。

【讨论】:

以上是关于CAAction 导致保留的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 GitHub Actions 中的 Actions 之间保留 WORKDIR?

Url.Action() 导致 System.AccessViolationException

带有 IBAction 的按钮导致“无法连接操作,目标类 NSNibExternalObjectPlaceholder 不响应 -action”错误

在 UIAlertController Action 中关闭 UIViewController 会导致崩溃

冲突的版本保留设置导致删除?

MapDispatchToProps 导致父组件中的 Typescript 错误,期望 Actions 作为 props 传递