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 传递