我第一次使用基于块的动画,并遇到“完成”块似乎被多次调用一次“动画”块的情况.我无法理解为什么会发生这种情况,但是在我的游戏运行一段时间之后似乎发生了一些一致性.这是有问题的代码……
- (voID)player:(Player *)player takeStep:(NSInteger)step onWalk:(NSArray *)walk { if (step < walk.count) { // take this step NSLog(@"taking step %i",step); NTTileVIEw *tile = [walk objectAtIndex:step]; [UIVIEw animateWithDuration:0.5 animations:^{ NSLog(@"animating step to tile %@",tile); [player.pawn movetoTile:tile]; if ([[NSUserDefaults standardUserDefaults] boolForKey:@"UseAudio"]) [boomBox play]; } completion:^(BOol finished){ if (finished) { NSLog(@"step %i done,moving on",step); [self player:player takeStep:step+1 onWalk:walk]; } else { NSLog(@"step %i unfinished,jumPing to end",step); NTTileVIEw *lastTile = [walk lastObject]; [player.pawn setCenter:lastTile.center]; } }]; }}
这是一个递归方法,最初使用step = 1启动,并为玩家的pawn设置一个“tiles”数组以进行动画制作.完成每个步骤后,递归调用该方法以进行下一步.当阵列用完图块时,作业就完成了.在完成的块中,我们要么采取下一步,要么(如果动画没有完成),只需跳到最后一个图块.这是一个贯穿的日志……
1...[79719:1be03] taking step 12...[79719:1be03] animating step to tile <NTTileVIEw: 0x957cd30; baseClass = UIControl; frame = (273 260; 57 54); layer = <CALayer: 0x957cc90>>; ID = 31; type = TileTypeMethods; isHub = 0; isEndSpot = 03...[79719:1be03] step 1 done,moving on4...[79719:1be03] taking step 25...[79719:1be03] animating step to tile <NTTileVIEw: 0x957d3b0; baseClass = UIControl; frame = (268 202; 60 59); layer = <CALayer: 0x957d2e0>>; ID = 30; type = TileTypeTermsAndTheory; isHub = 0; isEndSpot = 06...[79719:1be03] step 1 unfinished,jumPing to end7...[79719:1be03] step 2 done,moving on8...[79719:1be03] taking step 39...[79719:1be03] animating step to tile <NTTileVIEw: 0x957dbc0; baseClass = UIControl; frame = (268 139; 59 64); layer = <CALayer: 0x957db40>>; ID = 29; type = TileTypePeople; isHub = 0; isEndSpot = 010...[79719:1be03] step 3 done,moving on
请注意,在第4行开始第二步后,日志报告第6行第一步的“未完成”完成,然后第7行报告完成的第二步.但是,第3行在第3行完成.它怎么可能是3号线和6号线都完成了?在这种情况下,一个完成了完成= YES而另一个完成= NO,但我也看到这个运行时记录了一个步骤的两个或多个finished = YES行.
什么会导致这样的事情?我甚至不确定从哪里开始寻找BUG,或者我只是不明白iOS动画的完成块的性质.
奇怪的是,这个代码适用于一个“游戏”,但是一旦应用程序在同一个游戏中启动一个新的“游戏”,代码开始产生更多“完成”命中,我开始的游戏越多,越多“完成”点击我得到的每个动画.感觉就像旧游戏遗留下来的一些垃圾干扰,但静态分析仪中没有泄漏.我很神秘.
更新和解决方案
这个问题是由于旧的废弃游戏板仍在收听移动棋子的通知.即使旧的主板已经发布,它们也没有在游戏结束时专门删除通知请求.由于系统不会立即丢弃释放的对象,因此那些“幽灵”板仍在监听移动棋子的全局通知.即使他们对我们“死”,他们仍然活着,可以回应并争夺典当的动画!
解决方案是在我们发布之前让每个板[[NSNotificationCenter defaultCenter] removeObserver:self].
解决方法 请参阅问题的更新.这个问题最终是关于第一次调用pawns从我们的董事会视图的旧发布副本调用的通知.请注意,通知在对象释放后仍然存在,请确保在完成对象时显式删除通知请求! 总结以上是内存溢出为你收集整理的ios – 已发布对象观察到的NSNotification全部内容,希望文章能够帮你解决ios – 已发布对象观察到的NSNotification所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)