大佬教程收集整理的这篇文章主要介绍了ios – 已发布对象观察到的NSNotification,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我第一次使用基于块的动画,并遇到“完成”块似乎被多次调用一次“动画”块的情况.我无法理解为什么会发生这种情况,但是在我的游戏运行一段时间之后似乎发生了一些一致性.这是有问题的代码……
- (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 1 2...[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 = 0 3...[79719:1be03] step 1 done,moving on 4...[79719:1be03] taking step 2 5...[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 = 0 6...[79719:1be03] step 1 unfinished,jumping to end 7...[79719:1be03] step 2 done,moving on 8...[79719:1be03] taking step 3 9...[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 = 0 10...[79719:1be03] step 3 done,moving on
请注意,在第4行开始第二步后,日志报告第6行第一步的“未完成”完成,然后第7行报告完成的第二步.但是,第3行在第3行完成.它怎么可能是3号线和6号线都完成了?在这种情况下,一个完成了完成= YES而另一个完成= NO,但我也看到这个运行时记录了一个步骤的两个或多个finished = YES行.
什么会导致这样的事情?我甚至不确定从哪里开始寻找bug,或者我只是不明白iOS动画的完成块的性质.
奇怪的是,这个代码适用于一个“游戏”,但是一旦应用程序在同一个游戏中启动一个新的“游戏”,代码开始产生更多“完成”命中,我开始的游戏越多,越多“完成”点击我得到的每个动画.感觉就像旧游戏遗留下来的一些垃圾干扰,但静态分析仪中没有泄漏.我很神秘.
更新和解决方案
这个问题是由于旧的废弃游戏板仍在收听移动棋子的通知.即使旧的主板已经发布,它们也没有在游戏结束时专门删除通知请求.由于系统不会立即丢弃释放的对象,因此那些“幽灵”板仍在监听移动棋子的全局通知.即使他们对我们“死”,他们仍然活着,可以回应并争夺典当的动画!
解决方案是在我们发布之前让每个板[[NSNotificationCenter defaultCenter] removeObserver:self].
以上是大佬教程为你收集整理的ios – 已发布对象观察到的NSNotification全部内容,希望文章能够帮你解决ios – 已发布对象观察到的NSNotification所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。